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

📄 smashtv.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
字号:
/*************************************************************************

  vidhrdw.c

  Functions to emulate the video hardware of the machine.

**************************************************************************/
#include "driver.h"
#include "TMS34010/tms34010.h"
#include "vidhrdw/generic.h"

void wms_stateload(void);
void wms_statesave(void);

unsigned short *wms_videoram;
int wms_videoram_size = 0x80000;

/* Variables in machine/smashtv.c */
extern unsigned char *wms_cmos_ram;
extern unsigned int wms_autoerase_enable;
extern unsigned int wms_autoerase_start;
extern unsigned int wms_dma_pal_word;

void wms_vram_w(int offset, int data)
{
	unsigned int tempw,tempwb;
	unsigned short tempwordhi;
	unsigned short tempwordlo;
	unsigned short datalo;
	unsigned short datahi;
	unsigned int mask;

	/* first vram data */
	tempwordhi = wms_videoram[offset+1];
	tempwordlo = wms_videoram[offset];
	tempw = (wms_videoram[offset]&0x00ff) + ((wms_videoram[offset+1]&0x00ff)<<8);
	tempwb = COMBINE_WORD(tempw,data);
	datalo = tempwb&0x00ff;
	datahi = (tempwb&0xff00)>>8;
	wms_videoram[offset] = (tempwordlo&0xff00)|datalo;
	wms_videoram[offset+1] = (tempwordhi&0xff00)|datahi;

	/* now palette data */
	tempwordhi = wms_videoram[offset+1];
	tempwordlo = wms_videoram[offset];
	mask = (~(((unsigned int) data)>>16))|0xffff0000;
	data = ((data&0xffff0000) | wms_dma_pal_word) & mask;
	tempw = (((unsigned short) (wms_videoram[offset]&0xff00))>>8) + (wms_videoram[offset+1]&0xff00);
	tempwb = COMBINE_WORD(tempw,data);
	datalo = tempwb&0x00ff;
	datahi = (tempwb&0xff00)>>8;
	wms_videoram[offset] = (tempwordlo&0x00ff)|(datalo<<8);
	wms_videoram[offset+1] = (tempwordhi&0x00ff)|(datahi<<8);
}
void wms_objpalram_w(int offset, int data)
{
	unsigned int tempw,tempwb;
	unsigned short tempwordhi;
	unsigned short tempwordlo;
	unsigned short datalo;
	unsigned short datahi;
	unsigned int mask;

	tempwordhi = wms_videoram[offset+1];
	tempwordlo = wms_videoram[offset];
	tempw = ((wms_videoram[offset]&0xff00)>>8) + (wms_videoram[offset+1]&0xff00);
	tempwb = COMBINE_WORD(tempw,data);
	datalo = tempwb&0x00ff;
	datahi = (tempwb&0xff00)>>8;
	wms_videoram[offset] = (tempwordlo&0x00ff)|(datalo<<8);
	wms_videoram[offset+1] = (tempwordhi&0x00ff)|(datahi<<8);
}
int wms_vram_r(int offset)
{
	return (wms_videoram[offset]&0x00ff) | (wms_videoram[offset+1]<<8);
}
int wms_objpalram_r(int offset)
{
	return (wms_videoram[offset]>>8) | (wms_videoram[offset+1]&0xff00);
}

int wms_vh_start(void)
{
	if ((wms_cmos_ram = malloc(0x8000)) == 0)
	{
		return 1;
	}
	if ((paletteram = malloc(0x4000)) == 0)
	{
		free(wms_cmos_ram);
		return 1;
	}
	if ((wms_videoram = malloc(wms_videoram_size)) == 0)
	{
		free(wms_cmos_ram);
		free(paletteram);
		return 1;
	}
	memset(wms_cmos_ram,0,0x8000);
	return 0;
}
int wms_t_vh_start(void)
{
	if ((wms_cmos_ram = malloc(0x8000)) == 0)
	{
		return 1;
	}
	if ((paletteram = malloc(0x4000)) == 0)
	{
		free(wms_cmos_ram);
		return 1;
	}
	if ((wms_videoram = malloc(0x100000)) == 0)
	{
		free(wms_cmos_ram);
		free(paletteram);
		return 1;
	}
	memset(wms_cmos_ram,0,0x8000);
	return 0;
}
void wms_vh_stop (void)
{
	free(wms_cmos_ram);
	free(wms_videoram);
	free(paletteram);
}

void wms_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
{
	int v,h;
	unsigned short *rv;
	int skip,col;

	rv = &wms_videoram[(~TMS34010_get_DPYSTRT(0) & 0x1ff0)<<5];
	col = Machine->drv->visible_area.max_x;
	skip = 511 - col;

	if (bitmap->depth==16)
	{
		unsigned int min = Machine->drv->visible_area.min_y;
		unsigned int max = Machine->drv->visible_area.max_y;
		unsigned short *pens = Machine->pens;										
																							
		for (v = min; v <= max; v++)									
		{																			
			unsigned short *rows = &((unsigned short *)bitmap->line[v])[0];			
			unsigned int diff = rows - rv;						
			h = col;
			do	
			{	
				*(rv+diff) = pens[*rv];											
				rv++;				
			}
			while (h--);
																					
			if (wms_autoerase_enable||(v>=wms_autoerase_start))						
			{																		
				memcpy(rv-col-1,&wms_videoram[510*512],(col+1)*sizeof(unsigned short));	
			}																		
																					
			rv = (((rv + skip) - wms_videoram) & 0x3ffff) + wms_videoram;			
		}																			
	}
	else
	{
		unsigned int min = Machine->drv->visible_area.min_y;
		unsigned int max = Machine->drv->visible_area.max_y;
		unsigned short *pens = Machine->pens;										
																							
		for (v = min; v <= max; v++)									
		{																			
			unsigned char *rows = &(bitmap->line[v])[0];			
			h = col;
			do	
			{	
				*(rows++) = pens[*(rv++)];											
			}
			while (h--);
																					
			if (wms_autoerase_enable||(v>=wms_autoerase_start))						
			{																		
				memcpy(rv-col-1,&wms_videoram[510*512],(col+1)*sizeof(unsigned short));	
			}																		
																					
			rv = (((rv + skip) - wms_videoram) & 0x3ffff) + wms_videoram;			
		}																			
	}
	wms_autoerase_start=1000;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -