Lr-fbneoをカスタムビルド

Raspberry Pi,SBC,エミュレーター

CRCチェックを無効にします

注意点として雑にCRCチェックを無効化しているので
動作しないROMの場合、帰ってこれない可能性があります。

ほめられたやり方ではないですが、MAME2000や2003extremeみたいに
エラーを無視するオプションを付けてくれない上に
オリジナルよりもCRCに厳格なのは、やめて欲しいところ。

ビルド済みバイナリとソース

ダウンロード
下記CRC無視の修正済みlibretro.cppと他ソース
Raspberry Pi4 x64用ビルド済libretroコアが同梱
ビルド環境はbullseye x64、同環境なら(たぶん)そのまま利用できます
Buster x64でも動作するかもしれませんが未検証です。

別環境や動作がおかしい場合は
src/burner/libretoro/fbneo_libretro.so を削除しご自身でビルドして下さい
オリジナルのlibretro.cppはlibretro.cpp.bakとして保存してあります。
配布のライセンスはこちら(英文)になります。

下準備

いつもやっている最新ソースにm72を巻き戻しをすると
Burn.oでエラーが出てビルドできませんでした(そこら辺も戻せば行けそうですが)
(めんどうなので)m72変更前のソースをCRCチェック無効にしてビルドします。

ソースのダウンロードと解凍

m72update前かつ /src/burner/Libretro があるコミットを選びました

$ wget https://github.com/libretro/FBNeo/archive/0d8c00b9f18aa4f83cbaf8cbf5e4f46889d35c4a.zip
$ unzip 0d8c00b9f18aa4f83cbaf8cbf5e4f46889d35c4a.zip

解凍するとFBNeo-0d8c00b9f18aa4f83cbaf8cbf5e4f46889d35c4aと言うフォルダーができます
libRetroフォークのコミットでもburnerフォルダに
Libretroがある物(派生)とない物(本家)が混在しているので注意です。

libretro.cppを書き換え

FBNeo-0d8c00b9f18aa4f83cbaf8cbf5e4f46889d35c4a\src\burner\libretro 内にある
libretro.cpp内のCRCチェックを全て潰します。

$ cd FBNeo-0d8c00b9f18aa4f83cbaf8cbf5e4f46889d35c4a\src\burner\libretro\
$ nano libretro.cpp

X11なら好きなテキストエディタでOK、ファイルをWindowsで編集するのもよし。(notepad以外)

書き換え前

	// Search rom dir
	snprintf_nowarn(path, sizeof(path), "%s%c%s", g_rom_dir, PATH_DEFAULT_SLASH_C(), romName);
	if (ZipOpen(path) == 0)
	{
		g_find_list_path.push_back(located_archive());
		located_archive *located = &g_find_list_path.back();
		located->path = path;
		located->ignoreCrc = false;
		ZipClose();
		HandleMessage(RETRO_LOG_INFO, "[FBNeo] Romset found at %s\n", path);
	}
	else
		HandleMessage(RETRO_LOG_INFO, "[FBNeo] No romset found at %s\n", path);
	// Search system fbneo subdirectory (where samples/hiscore are stored)
	snprintf_nowarn(path, sizeof(path), "%s%cfbneo%c%s", g_system_dir, PATH_DEFAULT_SLASH_C(), PATH_DEFAULT_SLASH_C(), romName);
	if (ZipOpen(path) == 0)
	{
		g_find_list_path.push_back(located_archive());
		located_archive *located = &g_find_list_path.back();
		located->path = path;
		located->ignoreCrc = false;
		ZipClose();
		HandleMessage(RETRO_LOG_INFO, "[FBNeo] Romset found at %s\n", path);
	}
	else
		HandleMessage(RETRO_LOG_INFO, "[FBNeo] No romset found at %s\n", path);
	// Search system directory
	snprintf_nowarn(path, sizeof(path), "%s%c%s", g_system_dir, PATH_DEFAULT_SLASH_C(), romName);
	if (ZipOpen(path) == 0)
	{
		g_find_list_path.push_back(located_archive());
		located_archive *located = &g_find_list_path.back();
		located->path = path;
		located->ignoreCrc = false;
		ZipClose();
		HandleMessage(RETRO_LOG_INFO, "[FBNeo] Romset found at %s\n", path);
	}
	else
		HandleMessage(RETRO_LOG_INFO, "[FBNeo] No romset found at %s\n", path);
}

書き換え後

ignoreCrcで検索し814行目と827行目と840行目の
located->ignoreCrc = false;をlocated->ignoreCrc = true;に書き換えます

	// Search rom dir
	snprintf_nowarn(path, sizeof(path), "%s%c%s", g_rom_dir, PATH_DEFAULT_SLASH_C(), romName);
	if (ZipOpen(path) == 0)
	{
		g_find_list_path.push_back(located_archive());
		located_archive *located = &g_find_list_path.back();
		located->path = path;
		located->ignoreCrc = true;
		ZipClose();
		HandleMessage(RETRO_LOG_INFO, "[FBNeo] Romset found at %s\n", path);
	}
	else
		HandleMessage(RETRO_LOG_INFO, "[FBNeo] No romset found at %s\n", path);
	// Search system fbneo subdirectory (where samples/hiscore are stored)
	snprintf_nowarn(path, sizeof(path), "%s%cfbneo%c%s", g_system_dir, PATH_DEFAULT_SLASH_C(), PATH_DEFAULT_SLASH_C(), romName);
	if (ZipOpen(path) == 0)
	{
		g_find_list_path.push_back(located_archive());
		located_archive *located = &g_find_list_path.back();
		located->path = path;
		located->ignoreCrc = true;
		ZipClose();
		HandleMessage(RETRO_LOG_INFO, "[FBNeo] Romset found at %s\n", path);
	}
	else
		HandleMessage(RETRO_LOG_INFO, "[FBNeo] No romset found at %s\n", path);
	// Search system directory
	snprintf_nowarn(path, sizeof(path), "%s%c%s", g_system_dir, PATH_DEFAULT_SLASH_C(), romName);
	if (ZipOpen(path) == 0)
	{
		g_find_list_path.push_back(located_archive());
		located_archive *located = &g_find_list_path.back();
		located->path = path;
		located->ignoreCrc = true;
		ZipClose();
		HandleMessage(RETRO_LOG_INFO, "[FBNeo] Romset found at %s\n", path);
	}
	else
		HandleMessage(RETRO_LOG_INFO, "[FBNeo] No romset found at %s\n", path);
}

ビルド

CRC処理を無視させる変更が終わったらビルドします

ここではRaspberry Pi用のビルドを解説していますが
WindowsやOSXやLinux他のコアビルドも可能です(完走するかは未確認)。

ユーザーはpiを想定していますが
最近のOSではpiユーザーがない場合もあるので、その場合は適宜書き換えをお願いします
自分の場合はRaspberry Pi4で64bitなので下記になりました

$ cd /home/pi/FBNeo-0d8c00b9f18aa4f83cbaf8cbf5e4f46889d35c4a/src/burner/libretro
$ make platform=rpi4_64

platform= はrpi1,rpi2,rpi3,rpi3_64,rpi4_64 とあるようなので(makefile参照)
機種およびOS環境に合わせて変更した上で実行して下さい、時間は長時間かかります

コアファイルの差し替え

RetroPieのlr-fbneoコアを差し替える場合は以下になります
元々のコアをfbneo_libretro.soからfbneo_libretro.so.bakにリネーム
その後、コピーして入れ替えます。

$ cd /opt/retropie/libretrocores/lr-fbneo
$ sudo mv fbneo_libretro.so fbneo_libretro.so.bak
$ cd /home/pi/FBNeo-0d8c00b9f18aa4f83cbaf8cbf5e4f46889d35c4a/src/burner/libretro
$ sudo cp fbneo_libretro.so /opt/retropie/libretrocores/lr-fbneo

X11で動くretroarchをインストールしている場合は(PIKissだかPiAppで出来たはず)
コアの追加でビルドしたfbneo_libretro.soを指定すれば読み込んで動作可能でした。

動作確認

前回はCRCエラーでロードできなかったdigdugがプレイ可能になりました。

m72修正前なので、RTypeも動作OKです。
※NEOGEOで一つエラーで起動不能がありましたが
NEOGEOの場合、CRCエラーがある物はレアなのでそのままにしています

ネックとしてはm72巻き戻しがエラー出るので対応が面倒くさいなぁと
RetoroPieではコア更新する必要もないでしょうから、コレでいいかなと
新しい物がよいなら、Raspberry Piなら本家SDL2版をビルドして動かせば事足りますね

公式ビルドがなくCRCエラーの回避方法がない
AndroidやMiyoo miniなんかは役立ちそうですが
そっちのクロスビルドは面倒くさいので追々ということで