📄 neogeo.c
字号:
fspr+=(code+1)*128 - 8 - (sy-oy)*8;
}
else /* normal */
{
dy = 8;
fspr+=code*128 + (sy-oy)*8;
}
{
const unsigned short *paldata; /* ASG 980209 */
paldata = &gfx->colortable[gfx->color_granularity * color];
if (flipx) /* X flip */
{
l=0;
if(zx==16)
{
for (y = sy;y <= ey;y++)
{
bm = line[y]+sx;
fspr+=l_y_skip[l]*dy;
mydword = read_dword((int *)(fspr+4));
col = (mydword>> 28)&0xf; if (col) bm[BL0] = paldata[col];
col = (mydword>> 20)&0xf; if (col) bm[BL1] = paldata[col];
col = (mydword>> 12)&0xf; if (col) bm[BL2] = paldata[col];
col = (mydword>> 4)&0xf; if (col) bm[BL3] = paldata[col];
col = (mydword>> 24)&0xf; if (col) bm[8 + BL0] = paldata[col];
col = (mydword>> 16)&0xf; if (col) bm[8 + BL1] = paldata[col];
col = (mydword>> 8)&0xf; if (col) bm[8 + BL2] = paldata[col];
col = (mydword>> 0)&0xf; if (col) bm[8 + BL3] = paldata[col];
mydword = read_dword((int *)fspr);
col = (mydword>> 28)&0xf; if (col) bm[4 + BL0] = paldata[col];
col = (mydword>> 20)&0xf; if (col) bm[4 + BL1] = paldata[col];
col = (mydword>> 12)&0xf; if (col) bm[4 + BL2] = paldata[col];
col = (mydword>> 4)&0xf; if (col) bm[4 + BL3] = paldata[col];
col = (mydword>> 24)&0xf; if (col) bm[12 + BL0] = paldata[col];
col = (mydword>> 16)&0xf; if (col) bm[12 + BL1] = paldata[col];
col = (mydword>> 8)&0xf; if (col) bm[12 + BL2] = paldata[col];
col = (mydword>> 0)&0xf; if (col) bm[12 + BL3] = paldata[col];
l++;
}
}
else
{
for (y = sy;y <= ey;y++)
{
bm = line[y]+sx;
fspr+=l_y_skip[l]*dy;
mydword = read_dword((int *)(fspr+4));
#ifdef LSB_FIRST
if (dda_x_skip[0]) {col = (mydword>>28)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[1]) {col = (mydword>>20)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[2]) {col = (mydword>>12)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[3]) {col = (mydword>> 4)&0xf; if (col) *bm = paldata[col]; bm++;}
#else
if (dda_x_skip[0]) {col = (mydword>> 4)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[1]) {col = (mydword>>12)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[2]) {col = (mydword>>20)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[3]) {col = (mydword>>28)&0xf; if (col) *bm = paldata[col]; bm++;}
#endif
mydword = read_dword((int *)fspr);
#ifdef LSB_FIRST
if (dda_x_skip[4]) {col = (mydword>> 28)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[5]) {col = (mydword>> 20)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[6]) {col = (mydword>> 12)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[7]) {col = (mydword>> 4)&0xf; if (col) *bm = paldata[col]; bm++;}
#else
if (dda_x_skip[4]) {col = (mydword>> 4)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[5]) {col = (mydword>> 12)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[6]) {col = (mydword>> 20)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[7]) {col = (mydword>> 28)&0xf; if (col) *bm = paldata[col]; bm++;}
#endif
mydword = read_dword((int *)(fspr+4));
#ifdef LSB_FIRST
if (dda_x_skip[8]) {col = (mydword>> 24)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[9]) {col = (mydword>> 16)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[10]) {col = (mydword>> 8)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[11]) {col = (mydword>> 0)&0xf; if (col) *bm = paldata[col]; bm++;}
#else
if (dda_x_skip[8]) {col = (mydword>> 0)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[9]) {col = (mydword>> 8)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[10]) {col = (mydword>>16)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[11]) {col = (mydword>>24)&0xf; if (col) *bm = paldata[col]; bm++;}
#endif
mydword = read_dword((int *)fspr);
#ifdef LSB_FIRST
if (dda_x_skip[12]) {col = (mydword>> 24)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[13]) {col = (mydword>> 16)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[14]) {col = (mydword>> 8)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[15]) {col = (mydword>> 0)&0xf; if (col) *bm = paldata[col]; bm++;}
#else
if (dda_x_skip[12]) {col = (mydword>> 0)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[13]) {col = (mydword>> 8)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[14]) {col = (mydword>> 16)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[15]) {col = (mydword>> 24)&0xf; if (col) *bm = paldata[col]; bm++;}
#endif
l++;
}
}
}
else /* normal */
{
l=0;
if(zx==16)
{
for (y = sy ;y <= ey;y++)
{
bm = line[y] + sx;
fspr+=l_y_skip[l]*dy;
mydword = read_dword((int *)fspr);
col = (mydword>> 0)&0xf; if (col) bm[BL0] = paldata[col];
col = (mydword>> 8)&0xf; if (col) bm[BL1] = paldata[col];
col = (mydword>>16)&0xf; if (col) bm[BL2] = paldata[col];
col = (mydword>>24)&0xf; if (col) bm[BL3] = paldata[col];
col = (mydword>> 4)&0xf; if (col) bm[8 + BL0] = paldata[col];
col = (mydword>>12)&0xf; if (col) bm[8 + BL1] = paldata[col];
col = (mydword>>20)&0xf; if (col) bm[8 + BL2] = paldata[col];
col = (mydword>>28)&0xf; if (col) bm[8 + BL3] = paldata[col];
mydword = read_dword((int *)(fspr+4));
col = (mydword>> 0)&0xf; if (col) bm[4 + BL0] = paldata[col];
col = (mydword>> 8)&0xf; if (col) bm[4 + BL1] = paldata[col];
col = (mydword>>16)&0xf; if (col) bm[4 + BL2] = paldata[col];
col = (mydword>>24)&0xf; if (col) bm[4 + BL3] = paldata[col];
col = (mydword>> 4)&0xf; if (col) bm[12 + BL0] = paldata[col];
col = (mydword>>12)&0xf; if (col) bm[12 + BL1] = paldata[col];
col = (mydword>>20)&0xf; if (col) bm[12 + BL2] = paldata[col];
col = (mydword>>28)&0xf; if (col) bm[12 + BL3] = paldata[col];
l++;
}
}
else
{
for (y = sy ;y <= ey;y++)
{
bm = line[y] + sx;
fspr+=l_y_skip[l]*dy;
mydword = read_dword((int *)fspr);
#ifdef LSB_FIRST
if (dda_x_skip[0]) {col = (mydword>> 0)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[1]) {col = (mydword>> 8)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[2]) {col = (mydword>>16)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[3]) {col = (mydword>>24)&0xf; if (col) *bm = paldata[col]; bm++;}
#else
if (dda_x_skip[0]) {col = (mydword>>24)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[1]) {col = (mydword>>16)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[2]) {col = (mydword>> 8)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[3]) {col = (mydword>> 0)&0xf; if (col) *bm = paldata[col]; bm++;}
#endif
mydword = read_dword((int *)(fspr+4));
#ifdef LSB_FIRST
if (dda_x_skip[4]) {col = (mydword>> 0)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[5]) {col = (mydword>> 8)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[6]) {col = (mydword>>16)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[7]) {col = (mydword>>24)&0xf; if (col) *bm = paldata[col]; bm++;}
#else
if (dda_x_skip[4]) {col = (mydword>>24)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[5]) {col = (mydword>>16)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[6]) {col = (mydword>> 8)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[7]) {col = (mydword>> 0)&0xf; if (col) *bm = paldata[col]; bm++;}
#endif
mydword = read_dword((int *)fspr);
#ifdef LSB_FIRST
if (dda_x_skip[8]) {col = (mydword>> 4)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[9]) {col = (mydword>>12)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[10]) {col = (mydword>>20)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[11]) {col = (mydword>>28)&0xf; if (col) *bm = paldata[col]; bm++;}
#else
if (dda_x_skip[8]) {col = (mydword>>28)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[9]) {col = (mydword>>20)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[10]) {col = (mydword>>12)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[11]) {col = (mydword>> 4)&0xf; if (col) *bm = paldata[col]; bm++;}
#endif
mydword = read_dword((int *)(fspr+4));
#ifdef LSB_FIRST
if (dda_x_skip[12]) {col = (mydword>> 4)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[13]) {col = (mydword>>12)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[14]) {col = (mydword>>20)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[15]) {col = (mydword>>28)&0xf; if (col) *bm = paldata[col]; bm++;}
#else
if (dda_x_skip[12]) {col = (mydword>>28)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[13]) {col = (mydword>>20)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[14]) {col = (mydword>>12)&0xf; if (col) *bm = paldata[col]; bm++;}
if (dda_x_skip[15]) {col = (mydword>> 4)&0xf; if (col) *bm = paldata[col]; bm++;}
#endif
l++;
}
}
}
}
}
static void neo_drawgfx_char(struct osd_bitmap *dest,const struct GfxElement *gfx,
unsigned int code,unsigned int color,int sx,int sy)
{
int ex,ey,y,start;
const unsigned char *sd;
unsigned char *bm;
int col;
int *sd4;
int col4;
const unsigned short *paldata; /* ASG 980209 */
unsigned char **sline=gfx->gfxdata->line;
unsigned char **dline=dest->line;
ex = sx + 7; /* Clip width */
ey = sy + 7; /* Clip height */
start = code * 8; /* 8 bytes per character */
paldata = &gfx->colortable[gfx->color_granularity * color];
if ((gfx->pen_usage[code] & 1) == 0)
{
/* character is totally opaque, can disable transparency */
for (y = sy;y <= ey;y++)
{
bm = dline[y]+sx;
sd = sline[start];
bm[0] = paldata[sd[0]];
bm[1] = paldata[sd[1]];
bm[2] = paldata[sd[2]];
bm[3] = paldata[sd[3]];
bm[4] = paldata[sd[4]];
bm[5] = paldata[sd[5]];
bm[6] = paldata[sd[6]];
bm[7] = paldata[sd[7]];
start+=1;
}
}
else
{
for (y = sy;y <= ey;y++)
{
bm = dline[y]+sx;
sd4 = (int *)(sline[start]);
if ((col4=read_dword(sd4)) != 0){
col = col4&0xff;
if (col) bm[BL0] = paldata[col];
col = (col4>>8)&0xff;
if (col) bm[BL1] = paldata[col];
col = (col4>>16)&0xff;
if (col) bm[BL2] = paldata[col];
col = (col4>>24)&0xff;
if (col) bm[BL3] = paldata[col];
}
sd4++;
bm+=4;
if ((col4=read_dword(sd4)) != 0){
col = col4&0xff;
if (col) bm[BL0] = paldata[col];
col = (col4>>8)&0xff;
if (col) bm[BL1] = paldata[col];
col = (col4>>16)&0xff;
if (col) bm[BL2] = paldata[col];
col = (col4>>24)&0xff;
if (col) bm[BL3] = paldata[col];
}
start+=1;
}
}
}
/******************************************************************************/
void neogeo_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
{
int sx =0,sy =0,oy =0,my =0,zx = 1, rzy = 1;
int offs,i,count,y,x;
int tileno,tileatr,t1,t2,t3;
char fullmode=0;
int ddax=16,dday=256,rzx=15,yskip=0;
unsigned char **line=bitmap->line;
unsigned int *pen_usage;
struct GfxElement *gfx=Machine->gfx[2]; /* Save constant struct dereference */
#ifdef NEO_DEBUG
char buf[80];
struct DisplayText dt[2];
/* debug setting, tile view mode connected to '8' */
if (osd_key_pressed(OSD_KEY_8))
{
while (osd_key_pressed(OSD_KEY_8)) ;
dotiles ^= 1;
}
/* tile view - 0x80, connected to '9' */
if (osd_key_pressed(OSD_KEY_9))
{
if (screen_offs > 0)
screen_offs -= 0x80;
}
/* tile view + 0x80, connected to '0' */
if (osd_key_pressed(OSD_KEY_0))
{
if (screen_offs < 0x10000)
screen_offs += 0x80;
}
#endif
/* Palette swap occured after last frame but before this one */
if (palette_swap_pending) swap_palettes();
/* Do compressed palette stuff */
neogeo_palette();
fillbitmap(bitmap,palette_transparent_pen,&Machine->drv->visible_area);
#ifdef NEO_DEBUG
if (!dotiles) { /* debug */
#endif
/* Draw sprites */
for (count=0;count<0x300;count+=2) {
t3 = READ_WORD( &vidram[0x10000 + count] );
t1 = READ_WORD( &vidram[0x10400 + count] );
t2 = READ_WORD( &vidram[0x10800 + count] );
/* If this bit is set this new column is placed next to last one */
if (t1 & 0x40) {
sx += rzx;
if ( sx >= 0x1F0 )
sx -= 0x200;
/* Get new zoom for this column */
zx = (t3 >> 8) & 0x0f;
if(neogeo_game_fix==7 && (t3==0 || t3==0x147f))
zx=0xf;
sy = oy;
} else { /* nope it is a new block */
/* Sprite scaling */
zx = (t3 >> 8) & 0x0f;
rzy = t3 & 0xff;
if(neogeo_game_fix==7 && (t3==0 || t3==0x147f))
{
zx=0xf;
rzy=0xff;
}
sx = (t2 >> 7);
if ( sx >= 0x1F0 )
sx -= 0x200;
/* Number of tiles in this strip */
my = t1 & 0x3f;
if (my == 0x20) fullmode = 1;
else if (my >= 0x21) fullmode = 2; /* most games use 0x21, but */
/* Alpha Mission II uses 0x3f */
else fullmode = 0;
sy = 0x1F0 - (t1 >> 7);
if (sy > 0x100) sy -= 0x200;
if (fullmode == 2 || (fullmode == 1 && rzy == 0xff))
{
while (sy < -16) sy += 2 * (rzy + 1);
}
oy = sy;
if(my==0x21) my=0x20;
else if(rzy!=0xff && my!=0)
my=((my*16*256)/(rzy+1) + 15)/16;
if(my>0x20) my=0x20;
ddax=16; /* setup x zoom */
}
/* No point doing anything if tile strip is 0 */
if (my==0) continue;
/* Process x zoom */
if(zx!=15) {
rzx=0;
for(i=0;i<16;i++) {
ddax-=zx+1;
if(ddax<=0) {
ddax+=15+1;
dda_x_skip[i]=1;
rzx++;
}
else dda_x_skip[i]=0;
}
}
else rzx=16;
if(sx>311) continue;
/* Setup y zoom */
if(rzy==255)
yskip=16;
else
dday=256;
offs = count<<6;
/* my holds the number of tiles in each vertical multisprite block */
for (y=0; y < my ;y++) {
tileno = READ_WORD(&vidram[offs]);
offs+=2;
tileatr = READ_WORD(&vidram[offs]);
offs+=2;
if (high_tile && tileatr&0x10) tileno+=0x10000;
if (vhigh_tile && tileatr&0x20) tileno+=0x20000;
if (vvhigh_tile && tileatr&0x40) tileno+=0x40000;
if (tileatr&0x8) tileno=(tileno&~7)+((tileno+neogeo_frame_counter)&7);
else if (tileatr&0x4) tileno=(tileno&~3)+((tileno+neogeo_frame_counter)&3);
if (fullmode == 2 || (fullmode == 1 && rzy == 0xff))
{
if (sy >= 224) sy -= 2 * (rzy + 1);
}
else if (fullmode == 1)
{
if (y == 0x10) sy -= 2 * (rzy + 1);
}
if(rzy!=255)
{
yskip=0;
dda_y_skip[0]=0;
for(i=0;i<16;i++)
{
dda_y_skip[i+1]=0;
dday-=rzy+1;
if(dday<=0)
{
dday+=256;
yskip++;
dda_y_skip[yskip]++;
}
else dda_y_skip[yskip]++;
}
}
if ( (tileatr>>8) != 0)
if (sy<224)
NeoMVSDrawGfx(line,
gfx,
tileno,
tileatr >> 8,
tileatr & 0x01,tileatr & 0x02,
sx,sy,rzx,yskip
);
sy +=yskip;
} /* for y */
} /* for count */
/* Save some struct de-refs */
gfx=Machine->gfx[fix_bank];
pen_usage=gfx->pen_usage;
/* Character foreground */
for (y=2;y<30;y++) {
for (x=1;x<39;x++) {
int byte1 = (READ_WORD( &vidram[0xE000 + 2*y + x*64] ));
int byte2 = byte1 >> 12;
byte1 = byte1 & 0xfff;
if((pen_usage[byte1] & ~ 1) == 0) continue;
/*
drawgfx(bitmap,
gfx,
byte1,
byte2,
0,0,
x*8,(y-2)*8,
&Machine->drv->visible_area,
TRANSPARENCY_PEN,
0);
*/
neo_drawgfx_char(bitmap,
gfx,
byte1,
byte2,
x*8,(y-2)*8);
}
}
#ifdef NEO_DEBUG
} else { /* debug */
offs = screen_offs;
for (y=0;y<15;y++) {
for (x=0;x<20;x++) {
unsigned char byte1 = vidram[offs + 4*y+x*128];
unsigned char byte2 = vidram[offs + 4*y+x*128+1];
unsigned char col = vidram[offs + 4*y+x*128+3];
unsigned char byte3 = vidram[offs + 4*y+x*128+2];
tileno = byte1 + (byte2 << 8);
if (high_tile && byte3&0x10) tileno+=0x10000;
if (vhigh_tile && byte3&0x20) tileno+=0x20000;
if (vvhigh_tile && byte3&0x40) tileno+=0x40000;
NeoMVSDrawGfx(line,
Machine->gfx[2],
tileno,
col,
byte3 & 0x01,byte3 & 0x02,
x*16,y*16,16,16
);
}
}
sprintf(buf,"POS : %04X , VDP regs %04X",screen_offs, (screen_offs >> 6) );
dt[0].text = buf;
dt[0].color = DT_COLOR_RED;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -