www.pudn.com > ncdzsrc.rar > loadscr.c


/*************************************************************************** 
 
	loadscr.c 
 
	NEOGEO CD ロード画面処理 
 
***************************************************************************/ 
 
#include "neogeocd.h" 
 
 
/**************************************************************************** 
	プロトタイプ 
 ***************************************************************************/ 
 
static void update_screen(int clear); 
static int check_screen_data(offs_t offset, int type); 
static void loading_upload_fix(void); 
static void loading_upload_palette(void); 
 
 
/**************************************************************************** 
	ローカル変数 
 ***************************************************************************/ 
 
static int loading_wait; 
static int ssg_cleared; 
static int ssg_first_check; 
static int ssg_check; 
 
 
/**************************************************************************** 
	外部変数 
 ***************************************************************************/ 
 
extern int ssg_playing; 
 
 
/*************************************************************************** 
	グローバル関数 
 ***************************************************************************/ 
 
/*-------------------------------------------------------- 
 
	ロード画面開始 
 
	引  数: なし 
	戻り値: なし 
 
 -------------------------------------------------------*/ 
 
void loading_screen_start(void) 
{ 
	loading_wait = 0; 
	ssg_cleared = 0; 
	ssg_check = 0; 
 
	ssg_first_check = ssg_playing ? 0 : 1; 
 
	if (with_image()) 
	{ 
		int i; 
		offs_t offset; 
 
		// FIXプレーンを退避 
		for (i = 0; i < 0x500; i++) 
			m68000_write_memory_16(0x110804 + i * 2, neogeo_vidram16[0x7000 + i]); 
 
		// ロード画面セットアップ 
		m68000_interpreter(m68000_read_memory_32(0xc11c808), 0); 
 
		loading_upload_fix(); 
		loading_upload_palette(); 
 
		// 以下のゲームは画面更新が終わるまで待たないと、描画するのが 
		// 見えてしまう為、先に実行しFIXプレーンに描画しておく 
		// 龍虎の拳外伝、月華の剣士、月華の剣士2 
		offset = m68000_read_memory_32(0x11c80c); 
		if (offset != 0xc0c814) 
		{ 
			i = 64; // 念の為ループさせる上限を設定 
 
			if (GAME_NAME("aof3")) 
			{ 
				while (i--) 
				{ 
					offset = m68000_read_memory_32(0x11c80c); 
					m68000_interpreter(offset, 0); 
 
					if (offset == 0x1244f0 || offset == 0x124534 
					||  offset == 0x1245b2 || offset == 0x1245ce) 
						break; 
				} 
			} 
			else if (GAME_NAME("lastblad")) 
			{ 
				while (i--) 
				{ 
					offset = m68000_read_memory_32(0x11c80c); 
					m68000_interpreter(offset, 0); 
 
					if (offset == 0x124550 || offset == 0x124b28) 
						break; 
				} 
			} 
			else if (GAME_NAME("lastbld2")) 
			{ 
				while (i--) 
				{ 
					if (offset == 0x1244aa || offset == 0x124d9c) 
						break; 
				} 
			} 
		} 
 
		if (!(driver_flag & PATCH_SSRPG)) 
			loading_wait = 30; 
 
		fix_disable_w(0); 
		spr_disable_w(1); 
		video_enable_w(1); 
	} 
	else if (GAME_NAME("overtop")) 
	{ 
		UINT8 *src, *dst; 
 
		src = memory_region(REGION_CPU1) + 0xe0000; 
		dst = memory_region(REGION_GFX1); 
		swab(src, dst, 0x20000); 
#if ENABLE_SYSTEM_CHECK 
		dst = memory_region(REGION_GFX5); 
		swab(src, dst, 0x20000); 
#endif 
		neogeo_decode_fix(dst, 0, 0x20000); 
 
		m68000_write_memory_32(0x11c80c, 0x8db0);	// デフォルトだと終了時に落ちるので変更 
	} 
} 
 
 
/*-------------------------------------------------------- 
 
	ロード画面終了 
 
	引  数: なし 
	戻り値: なし 
 
 -------------------------------------------------------*/ 
 
void loading_screen_stop(void) 
{ 
	if (with_image()) 
	{ 
		UINT8 *src, *dst; 
		offs_t src_offs, dst_offs; 
		int i; 
 
		// パレットを復帰 
		src_offs = 0x11be06; 
		dst_offs = 0x400000; 
 
		for (i = 0; i < 0x200; i += 4) 
		{ 
			m68000_write_memory_32(dst_offs, m68000_read_memory_32(src_offs)); 
			src_offs += 4; 
			dst_offs += 4; 
		} 
 
		// FIXデータを復帰 
		src = memory_region(REGION_CPU1) + 0x115e06; 
		dst = memory_region(REGION_GFX1); 
		memcpy(dst, src, 0x6000); 
#if ENABLE_SYSTEM_CHECK 
		dst = memory_region(REGION_GFX5); 
		memcpy(dst, src, 0x6000); 
#endif 
		neogeo_decode_fix(dst, 0, 0x6000); 
 
		// FIXプレーンを復帰 
		for (i = 0; i < 0x500; i++) 
			neogeo_vidram16[0x7000 + i] = m68000_read_memory_16(0x110804 + i * 2); 
 
		fix_disable_w(0); 
		spr_disable_w(0); 
		video_enable_w(1); 
	} 
	else if (GAME_NAME("overtop")) 
	{ 
		// 不要だと思われるが、念の為戻す 
		m68000_write_memory_32(0x11c80c, 0x8854); 
	} 
 
	neogeo_set_title(); 
} 
 
 
/*------------------------------------------------------ 
 
	読み込み進行度更新 
 
	引  数: なし 
	戻り値: なし 
 
 -----------------------------------------------------*/ 
 
void loading_update_progress(void) 
{ 
	UINT32 progress; 
	UINT8 prev_progress; 
 
	progress = m68000_read_memory_32(0x108000 + 0x7690); 
	prev_progress = progress >> 16; 
 
	progress += m68000_read_memory_32(0x108000 + 0x768c); 
	m68000_write_memory_32(0x108000 + 0x7690, progress); 
 
	if (progress >= 0x800000) 
		m68000_write_memory_32(0x108000 + 0x7690, 0x800000); 
 
	m68000_interpreter(m68000_read_memory_32(0x11c80c), 0); 
 
	// watchdog 
	m68000_write_memory_8(0x300001, m68000_get_reg(M68K_D0)); 
} 
 
 
/*-------------------------------------------------------- 
 
	ロード画面の更新 
 
	引  数: なし 
	戻り値: なし 
 
 -------------------------------------------------------*/ 
 
void loading_updatescreen(void) 
{ 
	int update = with_image(); 
 
	if (!ssg_cleared) 
	{ 
		if (ssg_playing) 
		{ 
			ssg_first_check = 0; 
			ssg_check = 0; 
		} 
		else 
			ssg_check++; 
 
		if (ssg_check > 20 || (ssg_first_check && ssg_check > 5)) 
			ssg_cleared = 1; 
 
		if (update) 
			neogeo_loading_screenrefresh(); 
 
		m68000_write_memory_8(0x300001, m68000_get_reg(M68K_D0)); 
	} 
	else 
	{ 
		// CD-ROM読み込み完了を待つ 
		if (cdrom_loading_state == CDROM_LOADING) 
		{ 
			cdrom_load_next_data(); 
		} 
		else if (cdrom_loading_state == CDROM_DONE) 
		{ 
			if (loading_wait) 
			{ 
				loading_wait = 0; 
				loading_update_progress(); 
			} 
			else 
			{ 
				if (!(driver_flag & LOADING_TYPE1) && !cdrom_ipl_loading) 
					cdrom_finish_load_files(); 
 
				update = 0; 
				cdrom_loading_state = CDROM_IDLE; 
			} 
		} 
 
		if (osd_skip_this_frame() == 0) 
		{ 
			// アニメーション更新ストップフラグを消す 
			m68000_write_memory_8(0x108000 + 0x7793, 0x00); 
 
			// アニメーション (本来はデータを読み込むごとに処理) 
			m68000_interpreter(0xc0c8b2, 0); 
 
			neogeo_loading_screenrefresh(); 
		} 
 
		// オーバートップはフラグに関係なく常に更新 
		if (GAME_NAME("overtop")) update = 1; 
	} 
 
	sound_update(); 
 
	ui_menu(); 
	ui_show_popup(); 
 
	osd_update_video(update); 
} 
 
 
/*************************************************************************** 
	ローカル関数 
 ***************************************************************************/ 
 
/*-------------------------------------------------------- 
 
	指定したデータのオフセットを取得 
 
	引  数: int type   データ形式 
	戻り値: オフセット 
 
 -------------------------------------------------------*/ 
 
static offs_t check_offset; 
 
static int check_screen_data(offs_t offset, int type) 
{ 
	offs_t data_offset; 
	int data_type; 
 
	check_offset = offset; 
 
	do 
	{ 
		data_type = m68000_read_memory_32(check_offset); 
		check_offset += 4; 
 
		data_offset = m68000_read_memory_32(check_offset); 
		check_offset += 4; 
 
		if (data_type == type + 1) 
			return -1; 
 
		if (data_type == -1) 
			return -1; 
 
	} while (data_type != type); 
 
	return data_offset; 
} 
 
 
/*-------------------------------------------------------- 
 
	ロード画面のFIXデータ転送 
 
	引  数: なし 
	戻り値: なし 
 
 -------------------------------------------------------*/ 
 
static void loading_upload_fix(void) 
{ 
	UINT8 *src, *dst; 
	offs_t offset; 
 
	// 現在のFIXデータを保存 
	src = memory_region(REGION_GFX1); 
	dst = memory_region(REGION_CPU1) + 0x115e06; 
#if (ENABLE_SYSTEM_CHECK == 0) 
	neogeo_undecode_fix(src, 0, 0x6000); 
#endif 
	memcpy(dst, src, 0x6000); 
 
	// BIOSのFIXデータを転送 
	src = memory_region(REGION_USER1) + 0x7c000; 
	dst = memory_region(REGION_GFX1); 
	memcpy(dst, src, 0x4000); 
#if ENABLE_SYSTEM_CHECK 
	dst = memory_region(REGION_GFX5); 
	memcpy(dst, src, 0x4000); 
#endif 
	neogeo_decode_fix(dst, 0, 0x4000); 
 
	offset = 0x120002; 
 
	// ゲーム個別のFIXデータを転送 
	while (1) 
	{ 
		UINT16 fix_offs, size; 
 
		offset = check_screen_data(offset, 1); 
		if (offset == -1) 
			break; 
 
		fix_offs = m68000_read_memory_32(offset); 
		offset += 4; 
 
		size = m68000_read_memory_32(offset); 
		offset += 4; 
 
		src = memory_region(REGION_CPU1); 
		dst = memory_region(REGION_GFX1); 
		memcpy(dst + (fix_offs >> 1), src + offset, size); 
#if ENABLE_SYSTEM_CHECK 
		dst = memory_region(REGION_GFX5); 
		memcpy(dst + (fix_offs >> 1), src + offset, size); 
#endif 
		neogeo_decode_fix(dst, fix_offs, size); 
 
		offset = check_offset; 
	} 
} 
 
 
/*-------------------------------------------------------- 
 
	ロード画面のパレット転送 
 
	引  数: なし 
	戻り値: なし 
 
 -------------------------------------------------------*/ 
 
static void loading_upload_palette(void) 
{ 
	int i; 
	offs_t src, dst, offset; 
 
	// 現在のパレットデータを保存 
	src = 0x400000; 
	dst = 0x11be06; 
 
	for (i = 0; i < 0x200; i += 4) 
	{ 
		m68000_write_memory_32(dst, m68000_read_memory_32(src)); 
		src += 4; 
		dst += 4; 
	} 
 
	// BIOSのパレットを設定 
	src = 0xc1701c; 
	dst = 0x400000; 
 
	for (i = 0; i < 0x200; i += 4) 
	{ 
		m68000_write_memory_32(dst, m68000_read_memory_32(src)); 
		src += 4; 
		dst += 4; 
	} 
 
	offset = 0x120002; 
 
	// ゲーム個別のパレットを転送 
	while (1) 
	{ 
		UINT16 palno; 
 
		src = check_screen_data(offset, 2); 
		if (src == -1) 
			break; 
 
		palno = m68000_read_memory_16(src); 
		src += 2; 
 
		dst = 0x400000 + (palno << 5); 
 
		for (i = 0; i < 16; i++) 
		{ 
			m68000_write_memory_16(dst, m68000_read_memory_16(src)); 
			src += 2; 
			dst += 2; 
		} 
 
		offset = check_offset; 
	} 
}