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

📄 neogeo.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
📖 第 1 页 / 共 4 页
字号:
		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 + -