📄 copia de cps1.c
字号:
x,y,0x8000);
}
}
}
}
/***************************************************************************
Scroll 2 (16x16 layer)
Attribute word layout:
0x0001 colour
0x0002 colour
0x0004 colour
0x0008 colour
0x0010 colour
0x0020 X Flip
0x0040 Y Flip
0x0080 ??? Priority
0x0100 ??? Priority
0x0200
0x0400
0x0800
0x1000
0x2000
0x4000
0x8000
***************************************************************************/
void cps1_palette_scroll2(unsigned short *base)
{
int elements = Machine->gfx[2]->total_elements;
int offs, code, colour;
for (offs=cps1_scroll2_size-4; offs>=0; offs-=4)
{
code=READ_WORD(&cps1_scroll2[offs]);
colour=READ_WORD(&cps1_scroll2[offs+2])&0x1f;
code+=cps1_game_config->bank_scroll2*0x04000;
base[colour] |= cps1_tile16_pen_usage[code % cps1_max_tile16];
}
}
void cps1_render_scroll2_bitmap(struct osd_bitmap *bitmap, int priority)
{
int sx, sy, scrly;
int ny=(scroll2y>>4); /* Rough Y */
for (sx=0; sx<CPS1_SCROLL2_WIDTH; sx++)
{
int n=ny;
for (sy=0; sy<0x09*2; sy++)
{
long newvalue;
int offsy, offsx, offs, colour, code;
n&=0x3f;
offsy = ((n&0x0f)*4 | ((n&0x30)*0x100))&0x3fff;
offsx=(sx*0x040)&0xfff;
offs=offsy+offsx;
colour=READ_WORD(&cps1_scroll2[offs+2]);
newvalue=*(long*)(&cps1_scroll2[offs]);
if ( newvalue != *(long*)(&cps1_scroll2_old[offs]) )
{
*(long*)(&cps1_scroll2_old[offs])=newvalue;
code=READ_WORD(&cps1_scroll2[offs]);
code+=cps1_game_config->bank_scroll2*0x04000;
/* Draw entire tile */
cps1_draw_tile16(bitmap,
Machine->gfx[2],
code,
colour&0x1f,
colour&0x20,colour&0x40,
16*sx,16*n,
0x0000);
}
n++;
}
}
}
void cps1_render_scroll2_high(struct osd_bitmap *bitmap, int priority)
{
#ifdef LAYER_DEBUG
static int s=0;
#endif
int sx, sy;
int nxoffset=(scroll2x&0x0f)+32; /* Smooth X */
int nyoffset=(scroll2y&0x0f)+32; /* Smooth Y */
int nx=(scroll2x>>4); /* Rough X */
int ny=(scroll2y>>4)-4; /* Rough Y */
for (sx=0; sx<0x32/2+4; sx++)
{
for (sy=0; sy<0x09*2; sy++)
{
int offsy, offsx, offs, colour, code, mask;
int n;
n=ny+sy;
offsy = ((n&0x0f)*4 | ((n&0x30)*0x100))&0x3fff;
offsx=((nx+sx)*0x040)&0xfff;
offs=offsy+offsx;
offs &= 0x3fff;
code=READ_WORD(&cps1_scroll2[offs]);
colour=READ_WORD(&cps1_scroll2[offs+2]);
mask=colour & 0x0180;
if (priority && mask)
{
int transp;
transp=cps1_transparency_scroll[mask>>7];
code+=cps1_game_config->bank_scroll2*0x04000;
cps1_draw_tile16(bitmap,
Machine->gfx[2],
code,
colour&0x1f,
colour&0x20,colour&0x40,
16*sx-nxoffset,
16*sy-nyoffset,
transp);
}
}
}
}
void cps1_render_scroll2_low(struct osd_bitmap *bitmap, int priority)
{
int scrly=-(scroll2y-0x20);
int scrlx=-(scroll2x+0x40-0x20);
if (cps1_flip_screen)
{
scrly=(CPS1_SCROLL2_HEIGHT*16)-scrly;
}
cps1_render_scroll2_bitmap(cps1_scroll2_bitmap, priority);
copyscrollbitmap(bitmap,cps1_scroll2_bitmap,
1,&scrlx,1,&scrly,&Machine->drv->visible_area,TRANSPARENCY_PEN,palette_transparent_pen);
}
void cps1_render_scroll2_distort(struct osd_bitmap *bitmap, int priority)
{
#define lines (0x40*0x10)
int other=0;
int scrly=-(scroll2y-0x20);
int i,scroll[lines];
int mask;
if (cps1_flip_screen)
{
scrly=(CPS1_SCROLL2_HEIGHT*16)-scrly;
}
cps1_render_scroll2_bitmap(cps1_scroll2_bitmap, priority);
switch (cps1_vid_cfg[cps1_game_config->alternative].distort_alt)
{
case 1:
other+=0x100;
for (i = 0;i < lines;i++)
{
int xdistort;
other&=0x1ff;
xdistort=READ_WORD(&cps1_other[other]);
other+=2;
scroll[i] = -(scroll2x+xdistort+0x40-0x20);
}
break;
case 2:
other+=0x200;
for (i = 0;i < lines;i++)
{
int xdistort;
int n;
other&=0x7ff;
n=other;
/*if (other & 0x100)
{
n=0x400-(other&0xff);
} */
xdistort=READ_WORD(&cps1_other[n]);
other+=2;
scroll[i] = -(scroll2x+xdistort+0x40-0x20);
}
break;
case 3:
for (i = 0;i < lines;i++)
{
int xdistort;
other&=0x7ff;
xdistort=READ_WORD(&cps1_other[other]);
other+=2;
scroll[i] = -(scroll2x+xdistort+0x40-0x20);
}
break;
default:
for (i = 0;i < lines;i++)
{
scroll[i] = 0;
}
break;
}
copyscrollbitmap(bitmap,cps1_scroll2_bitmap,
lines,scroll,1,&scrly,&Machine->drv->visible_area,TRANSPARENCY_PEN,palette_transparent_pen);
}
/***************************************************************************
Scroll 3 (32x32 layer)
Attribute word layout:
0x0001 colour
0x0002 colour
0x0004 colour
0x0008 colour
0x0010 colour
0x0020 X Flip
0x0040 Y Flip
0x0080
0x0100
0x0200
0x0400
0x0800
0x1000
0x2000
0x4000
0x8000
***************************************************************************/
void cps1_palette_scroll3(unsigned short *base)
{
int sx,sy;
int nx=(scroll3x>>5)+1;
int ny=(scroll3y>>5)-1;
int gng_obj_kludge=cps1_game_config->gng_sprite_kludge;
int elements = Machine->gfx[3]->total_elements;
for (sx=0; sx<0x32/4+2; sx++)
{
for (sy=0; sy<0x20/4+1; sy++)
{
int offsy, offsx, offs, colour, code;
int n;
n=ny+sy;
offsy = ((n&0x07)*4 | ((n&0xf8)*0x0100))&0x3fff;
offsx=((nx+sx)*0x020)&0x7ff;
offs=offsy+offsx;
offs &= 0x3fff;
code=READ_WORD(&cps1_scroll3[offs]);
code+=cps1_game_config->bank_scroll3*0x01000;
if (gng_obj_kludge == 2 && code >= 0x01500)
{
code -= 0x1000;
}
colour=READ_WORD(&cps1_scroll3[offs+2]);
base[colour&0x1f] |=
cps1_tile32_pen_usage[code % cps1_max_tile32];
}
}
}
void cps1_render_scroll3(struct osd_bitmap *bitmap, int priority)
{
int sx,sy;
int nxoffset=scroll3x&0x1f;
int nyoffset=(scroll3y&0x1f);
int nx=(scroll3x>>5)+1;
int ny=(scroll3y>>5)-1; /* -1 */
int gng_obj_kludge=cps1_game_config->gng_sprite_kludge;
for (sx=1; sx<0x32/4+2; sx++)
{
for (sy=1; sy<0x20/4+2; sy++)
{
int offsy, offsx, offs, colour, code, transp;
int n;
n=ny+sy;
offsy = ((n&0x07)*4 | ((n&0xf8)*0x0100))&0x3fff;
offsx=((nx+sx)*0x020)&0x7ff;
offs=offsy+offsx;
offs &= 0x3fff;
code=READ_WORD(&cps1_scroll3[offs]);
if (code)
{
code+=cps1_game_config->bank_scroll3*0x01000;
if (gng_obj_kludge == 2 && code >= 0x01500)
{
code -= 0x1000;
}
colour=READ_WORD(&cps1_scroll3[offs+2]);
if (priority)
{
int mask=colour & 0x0180;
if (mask && !(colour & 0xf000))
{
transp=cps1_transparency_scroll[mask>>7];
cps1_draw_tile32(bitmap,
Machine->gfx[3],
code,
colour&0x1f,
colour&0x20,
colour&0x40,
32*sx-nxoffset,
32*sy-nyoffset,
transp);
}
}
else
{
cps1_draw_tile32(bitmap,Machine->gfx[3],
code,
colour&0x1f,
colour&0x20,colour&0x40,
32*sx-nxoffset,32*sy-nyoffset,
0x8000);
}
}
}
}
}
void cps1_render_layer(struct osd_bitmap *bitmap, int layer, int distort)
{
if (cps1_layer_enabled[layer])
{
switch (layer)
{
case 0:
cps1_render_sprites(bitmap, 0);
break;
case 1:
cps1_render_scroll1(bitmap, 0);
break;
case 2:
if (distort)
cps1_render_scroll2_distort(bitmap, 0);
else
cps1_render_scroll2_low(bitmap, 0);
break;
case 3:
cps1_render_scroll3(bitmap, 0);
break;
}
}
}
void cps1_render_high_layer(struct osd_bitmap *bitmap, int layer)
{
if (cps1_layer_enabled[layer])
{
switch (layer)
{
case 0:
break;
case 1:
break;
case 2:
cps1_render_scroll2_high(bitmap, 1);
break;
case 3:
cps1_render_scroll3(bitmap, 1);
break;
}
}
}
/***************************************************************************
Refresh screen
***************************************************************************/
void cps1_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
{
unsigned short palette_usage[cps1_palette_entries];
int layercontrol;
int i,offset;
int distort_scroll2=0;
int layer;
int videocontrol=cps1_port(0x22);
int old_flip;
old_flip=cps1_flip_screen;
cps1_flip_screen=videocontrol&0x8000;
if (old_flip != cps1_flip_screen)
{
/* Mark all of scroll 2 as dirty */
memset(cps1_scroll2_old, 0xff, cps1_scroll2_size);
}
layercontrol=READ_WORD(&cps1_output[cps1_layer_control]);
distort_scroll2=layercontrol & 0x01;
/* Special cases for scroll on / off */
switch (cps1_game_config->alternative)
{
case 7: /* Magic Sword */
distort_scroll2=layercontrol & 0x01;
break;
case 12: /* Street Fighter 2 */
case 13: /* Street Fighter 2 (Jap )*/
case 14: /* Street Fighter 2 (turbo) */
case 15: /* Street Fighter 2 (Rev E ) */
distort_scroll2=1;
break;
default:
break;
}
/* Get video memory base registers */
cps1_get_video_base();
/* Find the offset of the last sprite in the sprite table */
cps1_find_last_sprite();
/* Build palette */
cps1_build_palette();
/* Compute the used portion of the palette */
memset (palette_usage, 0, sizeof (palette_usage));
cps1_palette_sprites (&palette_usage[cps1_obj_palette]);
if (cps1_layer_enabled[1])
cps1_palette_scroll1 (&palette_usage[cps1_scroll1_palette]);
if (cps1_layer_enabled[2])
cps1_palette_scroll2 (&palette_usage[cps1_scroll2_palette]);
else
memset(cps1_scroll2_old, 0xff, cps1_scroll2_size);
if (cps1_layer_enabled[3])
cps1_palette_scroll3 (&palette_usage[cps1_scroll3_palette]);
for (i = offset = 0; i < cps1_palette_entries; i++)
{
int usage = palette_usage[i];
if (usage)
{
int j;
for (j = 0; j < 15; j++)
{
if (usage & (1 << j))
palette_used_colors[offset++] = PALETTE_COLOR_USED;
else
palette_used_colors[offset++] = PALETTE_COLOR_UNUSED;
}
palette_used_colors[offset++] = PALETTE_COLOR_TRANSPARENT;
}
else
{
memset (&palette_used_colors[offset], PALETTE_COLOR_UNUSED, 16);
offset += 16;
}
}
if (palette_recalc ())
{
/* Mark all of scroll 2 as dirty */
memset(cps1_scroll2_old, 0xff, cps1_scroll2_size);
}
/* Blank screen */
fillbitmap(bitmap,palette_transparent_pen,&Machine->drv->visible_area);
/* Draw layers */
cps1_render_layer(bitmap, (layercontrol>>0x06)&03, distort_scroll2);
cps1_render_layer(bitmap, (layercontrol>>0x08)&03, distort_scroll2);
cps1_render_layer(bitmap, (layercontrol>>0x0a)&03, distort_scroll2);
layer=(layercontrol>>0x0c)&03;
if (layer != 1)
{
/*
Don't draw layer 1 if it is the highest priority layer
We will draw it later.
*/
cps1_render_layer(bitmap, (layercontrol>>0x0c)&03, distort_scroll2);
}
/* Draw high priority layers */
cps1_render_high_layer(bitmap, (layercontrol>>0x06)&03);
cps1_render_high_layer(bitmap, (layercontrol>>0x08)&03);
cps1_render_high_layer(bitmap, (layercontrol>>0x0a)&03);
if (layer==1)
{
/* High priority sprites */
/*
Scroll 1 is highest priority. Must draw it over high
priority scroll parts of 2 and 3. This is correct
behaviour since Magic Sword interludes do not
look correct unless we do this.
*/
if (cps1_layer_enabled[1])
cps1_render_scroll1(bitmap, 0);
}
else
{
cps1_render_high_layer(bitmap, layer );
/* High priority sprites */
}
/* Render really high priority chars */
if (cps1_layer_enabled[1])
cps1_render_scroll1(bitmap, 1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -