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;
}
}