mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-04-13 12:22:33 -05:00
Compare commits
28 Commits
5ee81b30c6
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d4ce6df911 | ||
|
|
d0846ed78f | ||
|
|
07b4e55053 | ||
|
|
690e897ca7 | ||
|
|
7471c176c3 | ||
|
|
e72773e46d | ||
|
|
3c0c1cec02 | ||
|
|
faf4236463 | ||
|
|
1c0c502258 | ||
|
|
06c48e071a | ||
|
|
8f93ee2239 | ||
|
|
9ba8b02ff1 | ||
|
|
6fc2753f3e | ||
|
|
486b359c22 | ||
|
|
76a3543672 | ||
|
|
48d185dd7d | ||
|
|
6dbc3f510b | ||
|
|
97e26103f5 | ||
|
|
59d777a33d | ||
|
|
9ce4724fc4 | ||
|
|
7e46c23f3a | ||
|
|
6f22dd7738 | ||
|
|
c0e42ee4eb | ||
|
|
92b270c054 | ||
|
|
2f11542ed3 | ||
|
|
f9a612db4a | ||
|
|
812775f6b4 | ||
|
|
73ccb216f5 |
BIN
.github/assets/banner-light.png
vendored
Normal file
BIN
.github/assets/banner-light.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 246 KiB |
BIN
.github/assets/banner.png
vendored
Normal file
BIN
.github/assets/banner.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 135 KiB |
BIN
.github/assets/favicon.png
vendored
Normal file
BIN
.github/assets/favicon.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
BIN
.github/assets/logo.png
vendored
Normal file
BIN
.github/assets/logo.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
BIN
.github/assets/social-preview.png
vendored
Normal file
BIN
.github/assets/social-preview.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
36
.github/workflows/build.yml
vendored
36
.github/workflows/build.yml
vendored
@@ -58,16 +58,32 @@ jobs:
|
||||
run: |
|
||||
mkdir -p .cache/large
|
||||
gh release download large-files -D .cache/large/ 2>/dev/null || true
|
||||
for f in .cache/large/*; do
|
||||
[ -f "$f" ] || continue
|
||||
name=$(basename "$f")
|
||||
target=$(grep "$name" .gitignore | head -1)
|
||||
if [ -n "$target" ] && [ ! -f "$target" ]; then
|
||||
mkdir -p "$(dirname "$target")"
|
||||
cp "$f" "$target"
|
||||
echo "Restored: $target"
|
||||
fi
|
||||
done
|
||||
python3 -c "
|
||||
import hashlib, json, os, shutil
|
||||
db = json.load(open('database.json'))
|
||||
with open('.gitignore') as f:
|
||||
ignored = {l.strip() for l in f if l.strip().startswith('bios/')}
|
||||
cache = '.cache/large'
|
||||
if not os.path.isdir(cache):
|
||||
exit(0)
|
||||
idx = {}
|
||||
for fn in os.listdir(cache):
|
||||
fp = os.path.join(cache, fn)
|
||||
if os.path.isfile(fp):
|
||||
h = hashlib.sha1(open(fp, 'rb').read()).hexdigest()
|
||||
idx[h] = fp
|
||||
restored = 0
|
||||
for sha1, entry in db['files'].items():
|
||||
path = entry['path']
|
||||
if path in ignored and not os.path.exists(path):
|
||||
src = idx.get(sha1)
|
||||
if src:
|
||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||
shutil.copy2(src, path)
|
||||
print(f'Restored: {path}')
|
||||
restored += 1
|
||||
print(f'Total: {restored} files restored')
|
||||
"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
||||
37
.github/workflows/deploy-site.yml
vendored
37
.github/workflows/deploy-site.yml
vendored
@@ -36,6 +36,43 @@ jobs:
|
||||
|
||||
- run: pip install pyyaml mkdocs-material pymdown-extensions
|
||||
|
||||
- name: Restore large files from release
|
||||
run: |
|
||||
mkdir -p .cache/large
|
||||
gh release download large-files -D .cache/large/ 2>/dev/null || true
|
||||
python3 -c "
|
||||
import hashlib, json, os, shutil
|
||||
db = json.load(open('database.json'))
|
||||
with open('.gitignore') as f:
|
||||
ignored = {l.strip() for l in f if l.strip().startswith('bios/')}
|
||||
cache = '.cache/large'
|
||||
if not os.path.isdir(cache):
|
||||
exit(0)
|
||||
idx = {}
|
||||
for fn in os.listdir(cache):
|
||||
fp = os.path.join(cache, fn)
|
||||
if os.path.isfile(fp):
|
||||
h = hashlib.sha1(open(fp, 'rb').read()).hexdigest()
|
||||
idx[h] = fp
|
||||
restored = 0
|
||||
for sha1, entry in db['files'].items():
|
||||
path = entry['path']
|
||||
if path in ignored and not os.path.exists(path):
|
||||
src = idx.get(sha1)
|
||||
if src:
|
||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||
shutil.copy2(src, path)
|
||||
print(f'Restored: {path}')
|
||||
restored += 1
|
||||
print(f'Total: {restored} files restored')
|
||||
"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Refresh data directories
|
||||
run: python scripts/refresh_data_dirs.py
|
||||
continue-on-error: true
|
||||
|
||||
- name: Generate site
|
||||
run: |
|
||||
python scripts/generate_site.py
|
||||
|
||||
@@ -7,6 +7,16 @@
|
||||
3. Variants (alternate hashes): `bios/Manufacturer/Console/.variants/`
|
||||
4. Create a Pull Request - checksums are verified automatically
|
||||
|
||||
## Add a new platform
|
||||
|
||||
1. Write a scraper in `scripts/scraper/`
|
||||
2. Create the platform YAML in `platforms/`
|
||||
3. Register in `platforms/_registry.yml`
|
||||
4. Submit a Pull Request
|
||||
|
||||
Contributors who add platform support are credited in the README,
|
||||
on the documentation site, and in the BIOS packs.
|
||||
|
||||
## File conventions
|
||||
|
||||
- Files >50 MB go in GitHub release assets (`large-files` release)
|
||||
|
||||
14
README.md
14
README.md
@@ -1,8 +1,10 @@
|
||||
# RetroBIOS
|
||||
<p align="center">
|
||||
<img src=".github/assets/banner.png" alt="RetroBIOS" width="400">
|
||||
</p>
|
||||
|
||||
Complete BIOS and firmware packs for Batocera, BizHawk, EmuDeck, Lakka, Recalbox, RetroArch, RetroBat, RetroDECK, RetroPie, and RomM.
|
||||
|
||||
**7,296** verified files across **396** systems, ready to extract into your emulator's BIOS directory.
|
||||
**7,302** verified files across **396** systems, ready to extract into your emulator's BIOS directory.
|
||||
|
||||
## Quick Install
|
||||
|
||||
@@ -46,7 +48,7 @@ Each file is checked against the emulator's source code to match what the code a
|
||||
- **10 platforms** supported with platform-specific verification
|
||||
- **329 emulators** profiled from source (RetroArch cores + standalone)
|
||||
- **396 systems** covered (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
|
||||
- **7,296 files** verified with MD5, SHA1, CRC32 checksums
|
||||
- **7,302 files** verified with MD5, SHA1, CRC32 checksums
|
||||
- **8765 MB** total collection size
|
||||
|
||||
## Supported systems
|
||||
@@ -122,6 +124,10 @@ To keep packs accurate, each file is checked against the emulator's source code.
|
||||
<a href="https://github.com/monster-penguin"><img src="https://avatars.githubusercontent.com/u/266009589?v=4" width="50" title="monster-penguin"></a>
|
||||
|
||||
|
||||
## Community tools
|
||||
|
||||
- [BIOS Preservation Tool](https://github.com/monster-penguin/BIOS-Preservation-Tool) by [monster-penguin](https://github.com/monster-penguin) - scan, verify, and stage your own BIOS collection using RetroBIOS hash metadata
|
||||
|
||||
## Contributing
|
||||
|
||||
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
||||
@@ -130,4 +136,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
||||
|
||||
This repository provides BIOS files for personal backup and archival purposes.
|
||||
|
||||
*Auto-generated on 2026-04-02T05:33:10Z*
|
||||
*Auto-generated on 2026-04-03T12:59:52Z*
|
||||
|
||||
BIN
bios/Dragon/Dragon/delta2.rom
Normal file
BIN
bios/Dragon/Dragon/delta2.rom
Normal file
Binary file not shown.
BIN
bios/Other/NXEngine/nxengine/data/sprites.sif
Normal file
BIN
bios/Other/NXEngine/nxengine/data/sprites.sif
Normal file
Binary file not shown.
BIN
bios/Other/NXEngine/nxengine/tilekey.dat
Normal file
BIN
bios/Other/NXEngine/nxengine/tilekey.dat
Normal file
Binary file not shown.
BIN
bios/Texas Instruments/TI-99/Gram Kracker.ctg
Normal file
BIN
bios/Texas Instruments/TI-99/Gram Kracker.ctg
Normal file
Binary file not shown.
BIN
bios/Texas Instruments/TI-99/cf7+.ctg
Normal file
BIN
bios/Texas Instruments/TI-99/cf7+.ctg
Normal file
Binary file not shown.
BIN
bios/Texas Instruments/TI-99/ti-pcard.ctg
Normal file
BIN
bios/Texas Instruments/TI-99/ti-pcard.ctg
Normal file
Binary file not shown.
301
bios/sdlpal/desc.dat
Normal file
301
bios/sdlpal/desc.dat
Normal file
@@ -0,0 +1,301 @@
|
||||
本說明檔由 Eric-Chen 整理
|
||||
http://hi.baidu.com/eric_chensoft
|
||||
|
||||
適用於 SDLPAL (http://sdlpal.codeplex.com)
|
||||
|
||||
3d(觀音符)=以觀音聖水書寫的靈符。*HP+150
|
||||
3e(聖靈符)=具有女媧神強大靈力的符咒。*全體HP+300
|
||||
3f(金剛符)=使用後如有金鐘鐵罩護身。*增加防禦七回合。
|
||||
40(淨衣符)=具有祛病、驅邪的法力,*可解赤毒、屍毒、瘴毒。
|
||||
41(靈心符)=具有寧神、驅邪的靈效,*可解瘋魔、妖縛、昏睡、封咒。
|
||||
42(天師符)=茅山道士用來對付妖怪的符咒。
|
||||
43(風靈符)=產生風系法術的符咒。
|
||||
44(雷靈符)=產生雷系法術的符咒。
|
||||
45(水靈符)=產生冰系法術的符咒。
|
||||
46(火靈符)=產生火系法術的符咒。
|
||||
47(土靈符)=產生土系法術的符咒。
|
||||
48(舍利子)=得道高僧佛身火化後,*結成如珠狀的東西。*最大真氣值+3
|
||||
49(玉菩提)=墨玉菩提樹的種籽。*最大真氣值+5
|
||||
4a(銀杏子)=銀杏樹所結的白色核果。*最大體力值+3
|
||||
4b(糯米)=糯稻的米,富於黏性,*可解屍毒。
|
||||
4c(糯米糕)=糯米加麥芽、甜豆所煮的米糕,*可解屍毒。HP+25
|
||||
4d(鹽巴)=取海水煎熬或曝曬而成,用來調*味,有時可解毒。
|
||||
4e(茶葉蛋)=雞蛋水煮後,以茶葉入味。*便宜而好吃的食物。*HPMP+15
|
||||
4f(雞蛋)=便宜而常見的食物。*HPMP+10
|
||||
50(糖葫蘆)=以竹簽串李子,裹上麥芽糖,*形如葫蘆,故稱「糖葫蘆」。*HPMP+22
|
||||
51(蠟燭)=用蠟製的點火照明的東西。
|
||||
52(符紙)=泛黃的空白符紙。
|
||||
53(檀香)=含有檀香料的一種香,點燃用以*薰衣、薰室內,驅逐惡氣。
|
||||
54(大蒜)=具有除穢、祛病、護身等功能,*可以入藥。*戰鬥中服食避毒率+30%
|
||||
56(酒)=以米加酒麴釀製而成,*可解赤毒。HPMP+15
|
||||
57(雄黃)=天然產的礦物,塊狀、色黃,*可解赤毒。
|
||||
58(雄黃酒)=一點點的雄黃,撒在酒中,*習俗在端午節喝這種酒;*可解赤毒、瘴毒。
|
||||
59(九節菖蒲)=一種水草,葉子狹長如劍,*可解赤毒、屍毒、瘴毒、毒絲。
|
||||
5a(驅魔香)=以大蒜、雄黃、艾草、檀香等混合*煉製而成,點燃後發出魔物厭惡*的氣味,使魔物不敢接近。
|
||||
5b(十里香)=以生血、內藏、肉桂等煉製,*點燃後散發出吸引魔物的香味。
|
||||
5c(水果)=養顏美容、幫助消化。*HPMP+20
|
||||
5d(燒肉)=以炭火熏烤的醬汁豬肉。*HPMP+30
|
||||
5e(醃肉)=用鹽巴醃漬的豬肉。*HP+85
|
||||
5f(還魂香)=點燃後會散發奇異的香氣,*能牽引離體魂魄回歸軀體。*HP恢復10%
|
||||
60(贖魂燈)=以蓮燈作法與鬼差交涉,*贖回死者魂魄。*HP恢復30%
|
||||
61(孟婆湯)=消除死者罪孽業障,*使死者復活。*HP恢復50%
|
||||
62(天香續命露)=以大量珍貴秘藥精煉而成,*具有肉白骨、藥死人之奇效。*HP恢復100%
|
||||
63(止血草)=嚼碎後敷在傷口上,可迅速止血。*HP+50
|
||||
64(行軍丹)=活血順氣的藥丸。*HP+100
|
||||
65(金創藥)=上等刀傷藥,去腐生肌。*HP+200
|
||||
66(蟠果)=西王母蟠桃園遺種,*籽小肉厚汁液香甜。*HP+450
|
||||
67(紫菁玉蓉膏)=依宮廷秘方,采珍貴藥材煉製,*是療傷藥的極品。*HP+1000
|
||||
68(鼠兒果)=產於山間野地,多為鼠類所食,*經人發現移種平地。*MP+36
|
||||
69(還神丹)=寧神醒腦的藥丸。*MP+50
|
||||
6a(龍涎草)=經蛟龍唾涎灌溉而生,*具有補中益氣之療效。*MP+110
|
||||
6b(靈山仙芝)=寄生於枯木上的菌類,俗稱瑞草,*具有養氣培元之神效。*MP+260
|
||||
6c(雪蓮子)=白玉雪蓮之蓮子,其形珠圓玉潤,*服食者真氣充盈,經脈通暢。*MP+400
|
||||
6d(天仙玉露)=觀音菩薩淨瓶甘露水,*人間難求的仙界聖藥。*MP+700
|
||||
6e(神仙茶)=神仙廣成子養生延壽之秘方。*HPMP+440
|
||||
6f(靈葫仙丹)=修道隱士所煉丹藥。*HPMP+250
|
||||
70(試煉果)=藥王神農氏嘗百草時,*最早發現的珍藥。*靈力最大值+3
|
||||
71(女媧石)=女神媧皇煉石補天後,*所遺之五色石。*防禦最大值+3
|
||||
72(八仙石)=八仙石洞中所采集之丹礦。*防禦最大值+2
|
||||
73(蜂巢)=蜜蜂的窩,可以拿來丟敵人。
|
||||
74(屍腐肉)=沾染屍毒的腐敗肉塊。*毒性: 屍毒
|
||||
75(毒蛇卵)=煉蠱的材料。*毒性: 赤毒
|
||||
76(毒蠍卵)=煉蠱的材料。*毒性: 赤毒
|
||||
77(毒蟾卵)=煉蠱的材料。*毒性: 赤毒
|
||||
78(蜘蛛卵)=煉蠱的材料。*毒性: 赤毒
|
||||
79(蜈蚣卵)=煉蠱的材料。*毒性: 赤毒
|
||||
7a(鶴頂紅)=七大毒蠱,中毒後每回合損血,*至死方休。*解藥: 血海棠 致命藥引: 孔雀膽
|
||||
7b(孔雀膽)=七大毒蠱,中毒後每回合損血,*至死方休。*解藥: 金蠶蠱 致命藥引: 鶴頂紅
|
||||
7c(血海棠)=七大毒蠱,中毒後每回合損血,*至死方休。*解藥: 斷腸草 致命藥引: 三屍蠱
|
||||
7d(斷腸草)=七大毒蠱,中毒後每回合損血,*至死方休。*解藥: 三屍蠱 致命藥引: 金蠶蠱
|
||||
7e(醍醐香)=紫葉小白花,散發濃鬱香氣,*聞到香氣,便如酒醉一般。*妖縛四回合。
|
||||
7f(忘魂花)=青藍色小花,散發淡淡香氣,*聞到香氣,便會渾然忘我、*昏睡三回合。
|
||||
80(紫罌粟)=服食者會產生幻覺,敵我不分。*瘋魔四回合。
|
||||
81(鬼枯藤)=具毒性的黑褐色野生藤蔓,*可解赤毒、屍毒、瘴毒、毒絲。*HP-30
|
||||
82(腹蛇涎)=腹蛇的毒涎。*毒性: 瘴毒
|
||||
83(蜂王蜜)=蜜蜂所釀最好的蜜。*HPMP+150
|
||||
84(雪蛤蟆)=生長於天山極寒之地,僅銅錢般大*小。武術最大值+2 防禦最大值+2*靈力最大值+2
|
||||
85(赤蠍粉)=以整只赤尾蠍研磨成的粉末,*可使敵方全體中赤毒。
|
||||
86(化屍水)=碰到傷口血水,便腐蝕潰爛,*受傷者沾染立斃。
|
||||
87(迷魂香)=點燃蒙汗藥散發迷香,*可使敵人昏睡五回合。
|
||||
88(九陰散)=服食前若已中毒,可補滿體力,*但無法解毒;*服食前若沒中毒,即刻斃命。
|
||||
89(無影毒)=七大毒蠱,中毒後立即發作,*耗損一半體力。
|
||||
8a(三屍蠱)=七大毒蠱;中毒後,潛伏片刻即*會發作,毒性非常猛烈。*解藥: 孔雀膽 致命藥引: 血海棠
|
||||
8b(金蠶蠱)=七大毒蠱,中毒後每回合損血,*至死方休。*解藥: 鶴頂紅 致命藥引: 斷腸草
|
||||
8c(幻蠱)=分泌的毒液會影響人的腦部,*使人敵我不分,*瘋魔五回合。
|
||||
8d(隱蠱)=如帶刺甲蟲,將其身體捏破,*散發之煙霧可助我方隱匿形跡。*全體隱形三回合。
|
||||
8e(冰蠶蠱)=以雪山冰洞內所產所冰蠶培養的*蠱蟲,可做為攻擊道具。
|
||||
8f(火蠶蠱)=以麒麟炎洞內所產火蠶所培養的*蠱蟲,可做為攻擊道具。
|
||||
90(食妖蟲)=寄生宿主吸取靈氣,九回合後,*可煉成靈蠱。
|
||||
91(靈蠱)=以稀有藥物豢養的雌蠱。*全體MP+250
|
||||
92(爆烈蠱)=預先將法力灌輸在蠱蟲體內,*投擲敵人產生強烈爆炸。
|
||||
93(碧血蠶)=寄生宿主吸取血液,九回合後,*可煉成赤血蠶。
|
||||
94(蠱)=巫師施法所需的材料。
|
||||
95(赤血蠶)=吸血維生的毒蠱,*服食後體力完全恢復。
|
||||
96(金蠶王)=蠱中之王,月夜散發金色磷光,*服食後可提升修行。
|
||||
97(引路蜂)=跟隨引路蜂而行,*可回到迷宮起點。
|
||||
98(傀儡蟲)=湘西雲貴巫師用以控制屍體,*可使死者繼續攻擊九回合。
|
||||
99(梅花鏢)=形如梅花的暗器。*敵人HP-90
|
||||
9a(袖裏劍)=暗藏在衣袖中的飛劍。*敵人HP-170
|
||||
9b(透骨釘)=精鐵打造、三寸長的鐵針是*很鋒利的暗器。*敵人HP-250
|
||||
9c(雷火珠)=填充火藥的鐵珠,投擲撞擊*後會爆裂傷人。*敵人HP-135
|
||||
9d(毒龍砂)=以腹蛇毒煉製成的細砂,*可使敵方全體中瘴毒。*HP-55
|
||||
9e(吸星鎖)=鐵製鋼抓,尾端系以靈蠱蠶絲,*可吸取敵人HP180
|
||||
9f(纏魂絲)=千年蜘蛛的毒絲。*毒性: 毒絲
|
||||
a0(捆仙繩)=施有咒術的粗麻繩,*可令妖怪動彈不得,*妖縛五回合。
|
||||
a1(無影神針)=細如牛毛,傷人於無形。*敵人HP-400
|
||||
a2(血玲瓏)=紅色鐵球,四周裝有鋒利刀片。*敵方全體HP-300
|
||||
a3(長鞭)=生牛皮製的七尺軟鞭。*武術+20 身法+20
|
||||
a4(九截鞭)=以鐵節鐵環組成的九節軟鞭。*武術+66 身法+33
|
||||
a5(金蛇鞭)=以蛇皮絞以金絲編織成九尺軟鞭。*武術+99 身法+60
|
||||
a6(木劍)=用木材雕刻的劍,小孩玩具。*武術+2 身法+3
|
||||
a7(短刀)=一尺半長的鈍刀,可用來劈*砍木材。*武術+6 身法-5
|
||||
a8(鐵劍)=一般鐵匠大量生產的劍,打造*得頗為粗劣。*武術+10 防禦+3
|
||||
a9(大刀)=刀身寬而長,刃部鋒利,*背部厚重。*武術+16 防禦+1
|
||||
aa(仙女劍)=一尺長的雙手劍,適合女子*使用,可發出兩次攻擊。*武術+8 防禦+5
|
||||
ab(長劍)=一般鐵匠接受訂造的劍,*比鐵劍精致鋒利。*武術+25
|
||||
ac(紅纓刀)=精鋼打造,背厚刃薄,*刀柄飾以紅色長穗。*武術+38
|
||||
ad(越女劍)=劍身寬僅兩指,*專為女子打造。*武術+22 身法+8
|
||||
ae(戒刀)=佛門中人練武所用之刀,*嚴禁傷生染血。*武術+55 防禦+5 靈力+10
|
||||
af(玄鐵劍)=以珍貴的黑色鐵礦打造而成,*堅韌鋒利但極笨重。*武術+70 身法-20 靈力-15 防禦+9
|
||||
b0(芙蓉刀)=百花派獨門兵器雙手彎刀,*可發出兩次攻擊。*武術+16 身法+8
|
||||
b1(柳月刀)=細長鐵製雙刀,形如柳葉新月,*可發出兩次攻擊。*武術+28 身法+12 防禦+3
|
||||
b2(青鋒劍)=名家精心打造的劍,輕薄鋒利。*武術+75 身法+15
|
||||
b3(苗刀)=苗族戰士所慣用的佩刀。*武術+70 身法+32
|
||||
b4(鳳鳴刀)=出鞘之聲有如鳳鳴,*故稱「鳳鳴刀」。武術+124*防禦+9 身法+32 靈力+16
|
||||
b5(雙龍劍)=與一般劍長度相同的雙手劍,*可發出兩次攻擊。*武術+62 防禦+9 身法+9
|
||||
b6(玉女劍)=鴛鴦雙劍中的雌劍,與金童劍為*一對。武術+100 靈力+15*身法+20 吉運+30
|
||||
b7(金童劍)=鴛鴦雙劍中的雄劍,與玉女劍為*一對。武術+100 吉運+30*身法+20 靈力+15 防禦+3
|
||||
b8(龍泉劍)=龍泉的水質非常適合造劍,*當地生產的劍叫龍泉劍。*武術+88 身法+20 吉運+22
|
||||
b9(鬼牙刀)=苗刀的一種,刀尖倒鉤,*又稱「勾魂刀」。*武術+90 身法+26 吉運-9
|
||||
ba(七星劍)=劍身鑲嵌七顆金黃寶石,可吸取北*斗七星之精氣。武術+120 靈力+50*身法+32 吉運+33 防禦+7
|
||||
bb(玄冥寶刀)=可連續攻擊敵方全體兩次,*傳說是魔族的邪異兵器。*武術+98 身法+98 吉運+98
|
||||
bc(巫月神刀)=苗族拜月教鎮教之寶。*武術+132 靈力+55 防禦+29*身法+45 吉運+36
|
||||
bd(盤龍劍)=鑄劍宗師歐冶子所煉寶劍,劍身鑄*有青龍盤柱。武術+134 靈力+37*防禦+8 身法+40 吉運+32
|
||||
be(太極劍)=道祖張陵之隨身配劍,天師仗以降*妖伏魔。武術+158 靈力+90*防禦+35 身法+50 吉運+33
|
||||
bf(無塵劍)=上古神劍,指天天崩、劃地地裂。*武術+200 防禦+20 身法+77*吉運+33
|
||||
c0(青蛇杖)=雕刻雙蛇纏繞的綠玉杖。*武術+50 靈力+62 防禦+6
|
||||
c1(鬼頭杖)=苗族巫師役鬼煉蠱之法器,*頭顱中囚禁四十九條生魂。*武術+70 靈力+88 防禦+11
|
||||
c2(冥蛇杖)=來自冥界之魔杖,號令群邪,*杖頭鑲嵌千年蛇王內丹。*武術+88 靈力+120 防禦+22
|
||||
c3(天蛇杖)=女神媧皇煉化五色石所用法杖。*武術+100 靈力+150 防禦+33*吉運+36
|
||||
c4(頭巾)=以剩餘布料縫製的頭巾。*防禦+1
|
||||
c5(青絲巾)=青色的絲織髮帶。*防禦+2
|
||||
c6(髮飾)=錫製的女子頭飾。*防禦+3
|
||||
c7(銀釵)=純銀的髮釵。*防禦+5
|
||||
c8(翠玉金釵)=鑲有綠翡翠的黃金髮釵。*防禦+9
|
||||
c9(皮帽)=羊皮縫製的帽子,非常保暖。*防禦+4
|
||||
ca(珍珠冠)=以珍珠縫綴的紅色錦冠。*防禦+13
|
||||
cb(天師帽)=道士做法時所戴的帽子。*防禦+11 靈力+3
|
||||
cc(紫金冠)=紫金冠以薄銅片鑄成,*外殼以紫飾金而成。*防禦+18
|
||||
cd(天蠶絲帶)=以極珍貴的天蠶絲織成,*輕薄柔韌。*防禦+25 身法+8
|
||||
ce(鳳凰羽毛)=金翅鳳凰腹部的銀色羽毛。*防禦+7 身法+24 吉運+9
|
||||
cf(沖天冠)=天兵神將遺留的護頭金盔,*頂插雙雉尾羽。*防禦+28法+5 靈力+3 吉運+3
|
||||
d0(布袍)=粗布縫製的交領長袖白袍。*防禦+3
|
||||
d1(藤甲)=以荊藤編製的護甲。*防禦+7
|
||||
d2(絲衣)=以蠶絲紡織而成,輕柔透氣。*防禦+3 身法+4
|
||||
d3(鐵鎖衣)=以鐵環扣鎖製成的護甲。*防禦+13 身法-10
|
||||
d4(夜行衣)=暗黑色的緊身衣靠,*便於隱匿夜色之中。*防禦+18 身法+12 吉運+12
|
||||
d5(青銅甲)=青銅製的獸面紋胸護甲。*防禦+22 身法-13
|
||||
d6(羅漢袍)=修行得道的和尚所穿的衣袍。*防禦+10 吉運+10 靈力+10
|
||||
d7(鐵鱗甲)=以魚鱗形甲片編綴而成的鎧甲。*防禦+28 身法-4
|
||||
d8(天師道袍)=天師道祖修行時所穿的法衣。*防禦+33 靈力+28
|
||||
d9(精鐵戰甲)=以橢圓形的精鐵片編綴而成,*光亮照人,*又稱「光明鎧」。防禦+40 身法-7
|
||||
da(金縷衣)=以金線穿玉片編製而成*又稱「金縷玉衣」。*防禦+7 身法-10
|
||||
db(鬼針冑)=長滿倒刺的銅製盔甲。*防禦+55 武術+9
|
||||
dc(天蠶寶衣)=以極珍貴的天蠶絲織成,*輕薄柔韌。*防禦+66
|
||||
dd(青龍寶甲)=龍鱗編綴而成,世間絕頂*戰甲。*防禦+90
|
||||
de(白虎之鎧)=以罕見的白虎皮製成的皮甲。*防禦+80
|
||||
df(玄武戰袍)=以玄武的殼甲鍛造而成,*材質堅韌色黑而無光澤。*防禦+80
|
||||
e0(朱雀戰衣)= 以南方火鳥的羽毛編織而成。*防禦+80
|
||||
e1(披風)=無領對襟、無袖的披衣,*俗稱「斗篷」。*防禦+2
|
||||
e2(護肩)=披於肩臂上的鎧甲,*又稱「掩膊」。*防禦+6
|
||||
e3(武士披風)=將帥所穿有護肩軟甲的戰帔。*防禦+12
|
||||
e4(護心鏡)=防護前胸要害的披甲,形如*銅鏡。防禦+20
|
||||
e5(霓虹羽衣)=東海霓虹鳥的羽毛織成的*披肩。*防禦+18 身法+18 吉運+18
|
||||
e6(菩提袈裟)=高等僧衣,又名「無垢衣」,*多為高僧與長老所穿。*防禦+31 靈力+16
|
||||
e7(虎紋披風)=以整張千年白額虎虎皮製成,*毛皮呈黃色,帶黑色橫紋。*防禦+40
|
||||
e8(鳳紋披風)=相傳為織女縫製的披風,*繡鳳織錦,光彩奪目。*防禦+52
|
||||
e9(龍紋披風)=布面繡雙龍搶珠之彩紋,*有神龍護體之功效。*防禦+60
|
||||
ea(聖靈披風)=巫后的遺物,潛藏神聖的力*量。防禦+66 靈力+30
|
||||
eb(草鞋)=以藺草編織而成,十分便宜,*穿起來很輕便,適宜行走。*防禦+1
|
||||
ec(木鞋)=以木材削製而成,鞋面刻有吉祥*圖案。*防禦+2
|
||||
ed(布靴)=粗布縫製的長統靴。*防禦+3 身法+2
|
||||
ee(繡花鞋)=以絲緞縫製,鞋面繡有龍頭鳳尾*花。*防禦+4
|
||||
ef(鐵履)=鞋底夾縫鐵片,較普通布靴重。*防禦+6
|
||||
f0(武僧靴)=羅漢僧練武所穿的布靴。*防禦+8 身法+6
|
||||
f1(鹿皮靴)=鞋面以鹿皮毛縫製,質地輕柔,*行動可如鹿般迅捷。*防禦+11 身法+9
|
||||
f2(疾風靴)=以薄如雲霧的蟬紗織成,*助穿者疾行如風。*防禦+14 身法+17
|
||||
f3(蓮花靴)=飾以金蓮的長統繡花鞋。*防禦+18 身法+5
|
||||
f4(虎皮靴)=取自東北虎的皮毛縫製。*防禦+21 身法+16
|
||||
f5(龍鱗靴)=以龍鱗編綴而成。*防禦+25 身法+12
|
||||
f6(步雲靴)=雲中子羽化登仙後,*所遺留之神靴。*防禦+28 身法+20
|
||||
f7(魅影神靴)=妖魔附體,身如鬼魅。*防禦+32 身法+26
|
||||
f8(香袋)=填充木屑、香粉的小布包,*常用來裝飾兼避邪的物品。*靈力+8 吉運+9 避毒率+20%
|
||||
f9(護腕)=粗布縫製之腕部護套。*防禦+2
|
||||
fa(鐵護腕)=精鋼打造之腕部護環。*防禦+5
|
||||
fb(竹笛)=青竹削製之七孔橫笛。*吉運+18
|
||||
fc(珍珠)=蚌類所生的球狀物,*是珍貴的裝飾品。*吉運+20
|
||||
fd(玉鐲)=戴在手臂上的玉製環形首飾。*防禦+5 吉運+9
|
||||
fe(唸珠)=佛教徒記數唸經咒或佛號次數的*計算珠。*靈力+5 防禦+5
|
||||
ff(銀針)=用銀針刺肉,以痛楚喚醒神智,*可解妖縛、昏睡、瘋魔。HP-9
|
||||
100(銅鏡)=青銅鑄造的照容用具。*防禦+6
|
||||
101(八卦鏡)=用朱砂在鏡面畫八卦,*可借用自然界的靈氣。*靈力+8 防禦+8
|
||||
102(幹坤鏡)=銅鏡背面鑄有太極乾坤圖,*可吸取天地陰陽靈氣。*靈力+14 防禦+14
|
||||
103(豹牙手環)=收集花豹的利牙串成的手環。*防禦+9
|
||||
104(聖靈珠)=女媧末族祖傳寶物,曆代聖魂歸依*之所。合體法術: 武神*靈力+128 防禦+15 避毒率+35%
|
||||
105(金罡珠)=大羅金仙修煉千年的內丹。*防禦+90
|
||||
106(五毒珠)=成精蟾怪的內丹,*佩戴後百毒不侵。
|
||||
107(風靈珠)=女媧降伏風神後,禁制風神於內的*寶珠。合體法術: 風卷殘雲*避風率+50%
|
||||
108(雷靈珠)=女媧降伏雷神後,禁制雷神於內的*寶珠。合體法術: 狂雷*避雷率+50%
|
||||
109(水靈珠)=女媧降伏雪妖後,禁制雪妖於內的*寶珠。合體法術: 風雪冰天*避水率+50%
|
||||
10a(火靈珠)=女媧降伏火神後,禁制火神於內的*寶珠。合體法術: 煉獄真火*避火率+50%
|
||||
10b(土靈珠)=女媧降伏山神後,禁制山神於內的*寶珠。合體法術: 泰山壓頂*避土率+50% 可用於脫離洞窟
|
||||
10c(煉蠱皿)=可將毒蛇卵、毒蠍卵、毒蟾卵、*蜘蛛卵、蜈蚣卵煉成蠱。
|
||||
10d(壽葫蘆)=戰鬥中發出真氣補充持有者,*有提神振氣之奇效。*HPMP每回合+20
|
||||
10e(紫金葫蘆)=收妖煉丹,需與靈葫咒配合。
|
||||
10f(布包)=長安富商的行李。
|
||||
110(桂花酒)=摻了水的酒。
|
||||
111(紫金丹)=水月宮最珍貴的仙丹靈藥。
|
||||
112(玉佛珠)=西方如來檀前的唸珠,經佛法薰陶*變化通靈。合體法術: 佛法無邊*靈力+88 防禦+18 避毒率+30%
|
||||
113(金鳳凰蛋殼)=藥材。
|
||||
114(火眼麒麟角)=藥材。
|
||||
116(毒龍膽)=千年毒蛟的膽,以毒攻毒可解天下*所有的毒。*若沒中毒吃毒龍膽會斃命。
|
||||
117(破天錘)=用來敲碎仙靈島石像的法寶。
|
||||
118(包袱)=嬸嬸替逍遙收拾的行李。
|
||||
119(銀杏果)=藥材。
|
||||
11a(鯉魚)=藥材。
|
||||
11b(鹿茸)=藥材。
|
||||
11c(釣竿)=借來的,記得還!
|
||||
11d(捕獸夾)=獵戶放置的捕鹿的道具。
|
||||
11e(六神丹)=韓家藥鋪的祖傳婦女良藥。
|
||||
11f(情書)=士兵委托的情書。
|
||||
120(玉佩)=婢女委托的玉佩。
|
||||
121(石鑰匙)=開啟隱龍窟後洞石門的鑰匙。
|
||||
122(天書)=書中仙附身於書中。
|
||||
123(香蕉)=誰喜歡吃香蕉?
|
||||
124(鳳紋手絹)=某人交付的信物。
|
||||
125(手卷)=李逍遙的父母親所留下的武功*秘笈。
|
||||
126(蘆葦漂)=可載人漂浮水面的草席。
|
||||
127(夢蛇)=女媧族的變身魔法,*能力大幅提升。
|
||||
128(氣療術)=我方單人HP+75
|
||||
129(觀音咒)=我方單人HP+150
|
||||
12a(凝神歸元)=我方單人HP+220
|
||||
12b(元靈歸心術)=我方單人HP+500
|
||||
12c(五氣朝元)=我方全體HP+300
|
||||
12d(還魂咒)=我方單人復活*HP恢復10%
|
||||
12e(贖魂)=我方單人復活*HP恢復30%
|
||||
12f(回夢)=敵方單人昏睡四回合。
|
||||
130(奪魂)=吸取敵人魂魄,中者立斃。
|
||||
131(鬼降)=敵方單人瘋魔四回合。
|
||||
132(淨衣咒)=解赤毒、屍毒、瘴毒。
|
||||
133(冰心訣)=解妖縛、昏睡、瘋魔、咒封。
|
||||
134(靈血咒)=解赤毒、屍毒、瘴毒、毒絲、*麻痹、催眠、瘋魔、咒封。
|
||||
135(金剛咒)=使用後如有金鐘鐵罩護身,*增加防禦七回合。
|
||||
136(真元護體)=使用後如有鐵鎧金甲護體,*增加防禦九回合。
|
||||
137(天罡戰氣)=七回合內,使用武器攻擊,*威力提升。
|
||||
138(風咒)=風系初級法術,*攻擊敵方單人。
|
||||
139(旋風咒)=風系中級法術,*攻擊敵方全體。
|
||||
13a(風卷殘雲)=風系高級法術,*攻擊敵方全體。
|
||||
13b(風神)=召喚風神,*最強的風系法術。
|
||||
13c(雷咒)=雷系初級法術,*攻擊敵方單人。
|
||||
13d(五雷咒)=雷系中級法術,*攻擊敵方全體。
|
||||
13e(天雷破)=雷系高級法術,*攻擊敵方單人。
|
||||
13f(狂雷)=雷系高級法術,*攻擊敵方全體。
|
||||
140(雷神)=召喚雷神,*最強的雷系法術。
|
||||
141(冰咒)=冰系初級法術,*攻擊敵方單人。
|
||||
142(玄冰咒)=冰系中級法術,*攻擊敵方全體。
|
||||
143(風雪冰天)=冰系高級法術,*攻擊敵方全體。
|
||||
144(風雪冰天)=冰系高級法術,*攻擊敵方全體。
|
||||
145(雪妖)=召喚雪妖,*最強的冰系法術。
|
||||
147(炎咒)=火系初級法術,*攻擊敵方單人。
|
||||
148(三昧真火)=火系中級法術,*攻擊敵方全體。
|
||||
149(炎殺咒)=火系高級法術,*攻擊敵方單人。
|
||||
14a(煉獄真火)=火系高級法術,*攻擊敵方全體。
|
||||
14c(土咒)=土系初級法術,*攻擊敵方單人。
|
||||
14d(飛岩術)=土系中級法術,*攻擊敵方全體。
|
||||
14e(地裂天崩)=土系中級法術,*攻擊敵方全體。
|
||||
14f(泰山壓頂)=土系高級法術,*攻擊敵方全體。
|
||||
150(山神)=召喚山神,*最強的土系法術。
|
||||
151(氣劍指)=蘇州林家的家傳武藝,*攻擊敵方全體。
|
||||
154(一陽指)=聚勁食指,發出剛猛的氣芒,*攻擊敵方單人。
|
||||
155(七訣劍氣)=以指代劍,發出裂地劍氣*攻擊敵方全體。
|
||||
156(斬龍訣)=以雄渾氣勁橫掃群魔,*攻擊敵方全體。
|
||||
158(銅錢鏢)=將金錢當做暗器,攻擊敵方*單人,一次使用五百文錢。
|
||||
159(禦劍術)=蜀山派入門劍法,*攻擊敵方單人。
|
||||
15a(萬劍訣)=劍芒如雨直落,*攻擊敵方全體。
|
||||
15c(天劍)=人劍合一,身化利劍,*攻擊敵方全體。
|
||||
15d(天師符法)=茅山道士用來對付妖怪*的符法,攻擊敵方單人。
|
||||
15f(武神)=召喚武神,神刀斬魔。
|
||||
160(三屍咒)=下蠱攻擊敵方單人,*有蠱時才能使用。
|
||||
161(禦蜂術)=以笛音指揮毒蜂,*攻擊敵方全體。
|
||||
162(萬蟻蝕象)=操縱食人毒蟻,*攻擊敵方單人。
|
||||
16b(劍神)=召喚劍神,萬劍齊飛。
|
||||
172(酒神)=召喚酒神,*用全身真氣爆發攻擊敵人。
|
||||
174(萬蠱蝕天)=放蠱攻擊敵方全體,*有蠱時才能使用。
|
||||
176(爆炸蠱)=預先將法力灌輸在蠱蟲體*內,投擲敵人產生強烈爆炸。
|
||||
179(飛龍探雲手)=偷取敵人的物品或金錢。
|
||||
180(靈葫咒)=當妖物體力低於四分之一時,*可將其收入紫金葫蘆中煉藥。
|
||||
185(火神)=召喚火神,*最強的火系法術。
|
||||
186(醉仙望月步)=五回合內,使用武器攻擊,*可連續出手兩次。
|
||||
188(金蟬脫殼)=戰鬥中逃跑。
|
||||
189(仙風雲體術)=身法暫時提升九回合。
|
||||
18a(乾坤一擲)=使用金錢鏢攻擊敵方全體,*會耗損大量金錢。
|
||||
127
database.json
127
database.json
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"generated_at": "2026-04-01T23:11:49Z",
|
||||
"total_files": 7296,
|
||||
"total_size": 9190327032,
|
||||
"generated_at": "2026-04-02T12:45:07Z",
|
||||
"total_files": 7302,
|
||||
"total_size": 9190488848,
|
||||
"files": {
|
||||
"520d3d1b5897800af47f92efd2444a26b7a7dead": {
|
||||
"path": "bios/3DO Company/3DO/3do_arcade_saot.bin",
|
||||
@@ -30004,8 +30004,8 @@
|
||||
"adler32": "0cb8a7e3"
|
||||
},
|
||||
"686ebb5f39dd4fc907a0b748867d0a022d2f1a60": {
|
||||
"path": "bios/Dragon/Dragon/deltados.rom",
|
||||
"name": "deltados.rom",
|
||||
"path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"name": "delta2.rom",
|
||||
"size": 8192,
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"md5": "024eac3db20f1b5cf98c30a0e4743201",
|
||||
@@ -40453,6 +40453,26 @@
|
||||
"crc32": "0c0644ba",
|
||||
"adler32": "c7b3f901"
|
||||
},
|
||||
"73acccee601b56a2b7f624b0227fa7e1d662ef4b": {
|
||||
"path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"name": "sprites.sif",
|
||||
"size": 59482,
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"md5": "ebc011b876b9a4755fe44fa45d366996",
|
||||
"sha256": "e80d72041dc20ddffb3fa7e22e4c51acb06d95e81058d5eeb888b5bf308424ea",
|
||||
"crc32": "4e42c240",
|
||||
"adler32": "f7421b99"
|
||||
},
|
||||
"74c14b15dbc2f36c81d2ad9cb65e2893298415da": {
|
||||
"path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"name": "tilekey.dat",
|
||||
"size": 1028,
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"md5": "d74d5681ad8d825f5c229db1ee931bbb",
|
||||
"sha256": "e84df7374f8eff014458c6d8611c44f03b39b8d1a7abf30a2347dbb085b55232",
|
||||
"crc32": "57841d84",
|
||||
"adler32": "2a2a106e"
|
||||
},
|
||||
"2d539603665b8194c671ef5189c5a2b6db3ac645": {
|
||||
"path": "bios/Other/QEMU/bios-256k.bin",
|
||||
"name": "bios-256k.bin",
|
||||
@@ -72553,6 +72573,16 @@
|
||||
"crc32": "b3ef7ac7",
|
||||
"adler32": "479a8ee1"
|
||||
},
|
||||
"56dd520570cdcdd60dda2eedc8af1e02a781dcc5": {
|
||||
"path": "bios/Texas Instruments/TI-99/Gram Kracker.ctg",
|
||||
"name": "Gram Kracker.ctg",
|
||||
"size": 7587,
|
||||
"sha1": "56dd520570cdcdd60dda2eedc8af1e02a781dcc5",
|
||||
"md5": "7551f1d578a32cccd97efd1adff15252",
|
||||
"sha256": "3e63f6a54a8001ddd75ecde70572c7030776d79817f46ee0dfcf5274dd03047f",
|
||||
"crc32": "f1c12fb2",
|
||||
"adler32": "16c3134e"
|
||||
},
|
||||
"4e764ab67dfcbee8adc5b7d98e7b2926a008b9d8": {
|
||||
"path": "bios/Texas Instruments/TI-99/TI-994A.ctg",
|
||||
"name": "TI-994A.ctg",
|
||||
@@ -72563,6 +72593,16 @@
|
||||
"crc32": "a092207d",
|
||||
"adler32": "ba312438"
|
||||
},
|
||||
"698c638e1773244a6bf8a353c87d210047cce402": {
|
||||
"path": "bios/Texas Instruments/TI-99/cf7+.ctg",
|
||||
"name": "cf7+.ctg",
|
||||
"size": 5768,
|
||||
"sha1": "698c638e1773244a6bf8a353c87d210047cce402",
|
||||
"md5": "d3fd9bc1fcaf48e5ed681c5ac31bc194",
|
||||
"sha256": "8998c8525a9014a7983a8ed3b03fa8210a08c205dacccd654f139f78f20623da",
|
||||
"crc32": "81f3aec2",
|
||||
"adler32": "23a55284"
|
||||
},
|
||||
"382292295c00dff348d7e17c5ce4da12a1d87763": {
|
||||
"path": "bios/Texas Instruments/TI-99/spchrom.bin",
|
||||
"name": "spchrom.bin",
|
||||
@@ -72583,6 +72623,16 @@
|
||||
"crc32": "1a52b40c",
|
||||
"adler32": "152e6876"
|
||||
},
|
||||
"c7bf5fcfea0502011dca76d12efcc242e23421b9": {
|
||||
"path": "bios/Texas Instruments/TI-99/ti-pcard.ctg",
|
||||
"name": "ti-pcard.ctg",
|
||||
"size": 71924,
|
||||
"sha1": "c7bf5fcfea0502011dca76d12efcc242e23421b9",
|
||||
"md5": "63f161f0d634e6092a1729b97efb00d1",
|
||||
"sha256": "06eae0519b66734b546d4a6508f8f20ab3f57d21819c469ff748e68816e27bce",
|
||||
"crc32": "62b3c3d0",
|
||||
"adler32": "4224aa4e"
|
||||
},
|
||||
"e05575b630bea7ff98b9ca1f083d745abb3110b6": {
|
||||
"path": "bios/Texas Instruments/TI-99/ti99_4a.zip",
|
||||
"name": "ti99_4a.zip",
|
||||
@@ -72962,6 +73012,16 @@
|
||||
"sha256": "7dc407fbccbf684dc677bed81120f45f0d3406ff7945eaf207a5c38b036c30e0",
|
||||
"crc32": "a42ef0fd",
|
||||
"adler32": "0d15827f"
|
||||
},
|
||||
"8c20ff26ebfefbf9b050b67af8083704003595ba": {
|
||||
"path": "bios/sdlpal/desc.dat",
|
||||
"name": "desc.dat",
|
||||
"size": 16027,
|
||||
"sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba",
|
||||
"md5": "084b6bc9804710a89a542335a3e4b1e0",
|
||||
"sha256": "0d6487d6832488130bc94b1ec5ee71766717b929c249693327089e461460ae40",
|
||||
"crc32": "5ea6b7fc",
|
||||
"adler32": "27df2df0"
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
@@ -77011,6 +77071,8 @@
|
||||
"82a22231d402cd3284c698ba16a51d1d": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc",
|
||||
"9a432244d9ee4a49e8ddcde64af94e05": "86fc8dc0932f983efa199e31ae05a4424772f959",
|
||||
"f20bb7bc1b97453161e63964f24a2785": "91d75a87872cbb88964bead92e0cbf8b72e836b6",
|
||||
"ebc011b876b9a4755fe44fa45d366996": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"d74d5681ad8d825f5c229db1ee931bbb": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"e8dcffae189b20fbe2722b857faa487c": "2d539603665b8194c671ef5189c5a2b6db3ac645",
|
||||
"8bef06d1aa74c9ff45b268a18efcc954": "cb1bd2cf5f89741900061955ac1a3b7cbd7a1ce9",
|
||||
"07ec9c82c2ac93d091f46236e93c8bbb": "359becb4c1dcd61c139ab3786983da9640677701",
|
||||
@@ -80221,9 +80283,12 @@
|
||||
"c6ff8204c5c81b7be34614dbbd690c8b": "8177bc6d5489d575cbfa9a004d097fc08c6f8c86",
|
||||
"6e30e823ddba73234480984ee50730c1": "630b9f529b954851fbdcfeb1d91a950d4bda0547",
|
||||
"42f768a66fa8b27dadb8361dd2e2e012": "8212fbd8899a2808c7ace4559245861e5bee2c9a",
|
||||
"7551f1d578a32cccd97efd1adff15252": "56dd520570cdcdd60dda2eedc8af1e02a781dcc5",
|
||||
"412ecbf991edcb68edd0e76c2caa4a59": "4e764ab67dfcbee8adc5b7d98e7b2926a008b9d8",
|
||||
"d3fd9bc1fcaf48e5ed681c5ac31bc194": "698c638e1773244a6bf8a353c87d210047cce402",
|
||||
"7adcaf64272248f7a7161cfc02fd5b3f": "382292295c00dff348d7e17c5ce4da12a1d87763",
|
||||
"04714f43347cefb2a051a77116344b3f": "693f5b4fe1e5eb6429fd6614fb7bb14350939814",
|
||||
"63f161f0d634e6092a1729b97efb00d1": "c7bf5fcfea0502011dca76d12efcc242e23421b9",
|
||||
"3df4d280ad76edc0662c2e89ad4f2f74": "e05575b630bea7ff98b9ca1f083d745abb3110b6",
|
||||
"01770fde15c34ff88bb49526d38cb1f6": "a11d1801594fa3d1f95d37bbcc2e0faa1ad013c6",
|
||||
"12ae505e36b850030f5188e960864775": "8d2865996a1a8d8a13fc9965c1bcf490f9621399",
|
||||
@@ -80261,7 +80326,8 @@
|
||||
"a9082f02d4f93c1f6c4e428e06b834e8": "d07114a9f3490338a265fb30d16b052c8da3bb7d",
|
||||
"8d4abc7dd31a64f2ddd811c19ae8c09e": "b3730071e789877bea3373ffa59ca673a4b1f4c9",
|
||||
"6e7e391c629332cc9d29902b98e52f94": "48024e2f5943ed86cb1b8e9443603991cdb05808",
|
||||
"bbd27768c16e6077b1a90dc0eb8558a3": "24a487f22f3da292e179b3edd6c30222a8ff933d"
|
||||
"bbd27768c16e6077b1a90dc0eb8558a3": "24a487f22f3da292e179b3edd6c30222a8ff933d",
|
||||
"084b6bc9804710a89a542335a3e4b1e0": "8c20ff26ebfefbf9b050b67af8083704003595ba"
|
||||
},
|
||||
"by_name": {
|
||||
"3do_arcade_saot.bin": [
|
||||
@@ -88782,7 +88848,7 @@
|
||||
"ddos42.rom": [
|
||||
"7747fe3d431b745b570629fe7f3f5d51b6d6f393"
|
||||
],
|
||||
"deltados.rom": [
|
||||
"delta2.rom": [
|
||||
"686ebb5f39dd4fc907a0b748867d0a022d2f1a60"
|
||||
],
|
||||
"dplus48.rom": [
|
||||
@@ -91706,6 +91772,12 @@
|
||||
"Doukutsu.exe": [
|
||||
"91d75a87872cbb88964bead92e0cbf8b72e836b6"
|
||||
],
|
||||
"sprites.sif": [
|
||||
"73acccee601b56a2b7f624b0227fa7e1d662ef4b"
|
||||
],
|
||||
"tilekey.dat": [
|
||||
"74c14b15dbc2f36c81d2ad9cb65e2893298415da"
|
||||
],
|
||||
"bios-256k.bin": [
|
||||
"2d539603665b8194c671ef5189c5a2b6db3ac645"
|
||||
],
|
||||
@@ -100468,15 +100540,24 @@
|
||||
"630b9f529b954851fbdcfeb1d91a950d4bda0547",
|
||||
"e05575b630bea7ff98b9ca1f083d745abb3110b6"
|
||||
],
|
||||
"Gram Kracker.ctg": [
|
||||
"56dd520570cdcdd60dda2eedc8af1e02a781dcc5"
|
||||
],
|
||||
"TI-994A.ctg": [
|
||||
"4e764ab67dfcbee8adc5b7d98e7b2926a008b9d8"
|
||||
],
|
||||
"cf7+.ctg": [
|
||||
"698c638e1773244a6bf8a353c87d210047cce402"
|
||||
],
|
||||
"spchrom.bin": [
|
||||
"382292295c00dff348d7e17c5ce4da12a1d87763"
|
||||
],
|
||||
"ti-disk.ctg": [
|
||||
"693f5b4fe1e5eb6429fd6614fb7bb14350939814"
|
||||
],
|
||||
"ti-pcard.ctg": [
|
||||
"c7bf5fcfea0502011dca76d12efcc242e23421b9"
|
||||
],
|
||||
"mo5-v1.1.rom": [
|
||||
"8d2865996a1a8d8a13fc9965c1bcf490f9621399"
|
||||
],
|
||||
@@ -100581,6 +100662,9 @@
|
||||
"Tortuga.dat": [
|
||||
"24a487f22f3da292e179b3edd6c30222a8ff933d"
|
||||
],
|
||||
"desc.dat": [
|
||||
"8c20ff26ebfefbf9b050b67af8083704003595ba"
|
||||
],
|
||||
"goldstar_fc1_enc.bin": [
|
||||
"8ef7503c948314d242da47b7fdc272f68dac2aee"
|
||||
],
|
||||
@@ -101713,6 +101797,12 @@
|
||||
"d64tano2.rom": [
|
||||
"e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e"
|
||||
],
|
||||
"deltados.rom": [
|
||||
"686ebb5f39dd4fc907a0b748867d0a022d2f1a60"
|
||||
],
|
||||
"Premier Micros - DeltaDOS": [
|
||||
"686ebb5f39dd4fc907a0b748867d0a022d2f1a60"
|
||||
],
|
||||
"exos20.rom": [
|
||||
"6033a0535136c40c47137e4d1cd9273c06d5fdff"
|
||||
],
|
||||
@@ -108265,6 +108355,8 @@
|
||||
"29e86dbc": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc",
|
||||
"aa727c5d": "86fc8dc0932f983efa199e31ae05a4424772f959",
|
||||
"0c0644ba": "91d75a87872cbb88964bead92e0cbf8b72e836b6",
|
||||
"4e42c240": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"57841d84": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"7db5c908": "2d539603665b8194c671ef5189c5a2b6db3ac645",
|
||||
"e7e3ac4c": "cb1bd2cf5f89741900061955ac1a3b7cbd7a1ce9",
|
||||
"e3f1ee0a": "359becb4c1dcd61c139ab3786983da9640677701",
|
||||
@@ -111475,9 +111567,12 @@
|
||||
"200dd7d0": "8177bc6d5489d575cbfa9a004d097fc08c6f8c86",
|
||||
"ea0cc014": "630b9f529b954851fbdcfeb1d91a950d4bda0547",
|
||||
"b3ef7ac7": "8212fbd8899a2808c7ace4559245861e5bee2c9a",
|
||||
"f1c12fb2": "56dd520570cdcdd60dda2eedc8af1e02a781dcc5",
|
||||
"a092207d": "4e764ab67dfcbee8adc5b7d98e7b2926a008b9d8",
|
||||
"81f3aec2": "698c638e1773244a6bf8a353c87d210047cce402",
|
||||
"58b155f7": "382292295c00dff348d7e17c5ce4da12a1d87763",
|
||||
"1a52b40c": "693f5b4fe1e5eb6429fd6614fb7bb14350939814",
|
||||
"62b3c3d0": "c7bf5fcfea0502011dca76d12efcc242e23421b9",
|
||||
"f93bd9f7": "e05575b630bea7ff98b9ca1f083d745abb3110b6",
|
||||
"71879a28": "a11d1801594fa3d1f95d37bbcc2e0faa1ad013c6",
|
||||
"237c60bf": "8d2865996a1a8d8a13fc9965c1bcf490f9621399",
|
||||
@@ -111515,7 +111610,8 @@
|
||||
"4a39a474": "d07114a9f3490338a265fb30d16b052c8da3bb7d",
|
||||
"bf1e4b9b": "b3730071e789877bea3373ffa59ca673a4b1f4c9",
|
||||
"e6b9ebfb": "48024e2f5943ed86cb1b8e9443603991cdb05808",
|
||||
"a42ef0fd": "24a487f22f3da292e179b3edd6c30222a8ff933d"
|
||||
"a42ef0fd": "24a487f22f3da292e179b3edd6c30222a8ff933d",
|
||||
"5ea6b7fc": "8c20ff26ebfefbf9b050b67af8083704003595ba"
|
||||
},
|
||||
"by_sha256": {
|
||||
"72a88b5b47b76bd5604b30c102c948fa7e0ee90ccbc83aba496c45cf90b5a0e7": "520d3d1b5897800af47f92efd2444a26b7a7dead",
|
||||
@@ -115563,6 +115659,8 @@
|
||||
"3ca567f014a71ea24734559ee63df8184886f17debeef41c4bf4cd6313d70bd1": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc",
|
||||
"0ed991887342fba9e4b71668ff4c14ed93c2b3a19b4874dd0282404a1c442094": "86fc8dc0932f983efa199e31ae05a4424772f959",
|
||||
"8a7a63b24bb21557fb597697bdf09248c1ab7e3298cacfa1166d764dd81e7fc3": "91d75a87872cbb88964bead92e0cbf8b72e836b6",
|
||||
"e80d72041dc20ddffb3fa7e22e4c51acb06d95e81058d5eeb888b5bf308424ea": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"e84df7374f8eff014458c6d8611c44f03b39b8d1a7abf30a2347dbb085b55232": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"ae6f6aa973aaccc143f57aa960fb035fd9de4daee4ad0cd713322f8c259e7650": "2d539603665b8194c671ef5189c5a2b6db3ac645",
|
||||
"3dfd946d0c03ab0e022f84f10c3eb5f1dd507761f73e7d8067511ba35a10f776": "cb1bd2cf5f89741900061955ac1a3b7cbd7a1ce9",
|
||||
"e8fc9e55790dbe3cb31f019a3deb57206ba6c54f5e581adb2ab2677a9d391472": "359becb4c1dcd61c139ab3786983da9640677701",
|
||||
@@ -118773,9 +118871,12 @@
|
||||
"55c318616fad4fc32335c59f97fbca21f0a02424bece13b088cc11e0af73d993": "8177bc6d5489d575cbfa9a004d097fc08c6f8c86",
|
||||
"5b4dc460e53715e422e9dd86e4f7e7f323cc5320d35213dcd56b960fb8876003": "630b9f529b954851fbdcfeb1d91a950d4bda0547",
|
||||
"172db86fc7f03808084fcf846ae1e53143d2d26ec6a72f437b9726c6b4295359": "8212fbd8899a2808c7ace4559245861e5bee2c9a",
|
||||
"3e63f6a54a8001ddd75ecde70572c7030776d79817f46ee0dfcf5274dd03047f": "56dd520570cdcdd60dda2eedc8af1e02a781dcc5",
|
||||
"5a1787ece8a37db887d60953471084e2ea44a6dbe529d20882f4824d97536fa4": "4e764ab67dfcbee8adc5b7d98e7b2926a008b9d8",
|
||||
"8998c8525a9014a7983a8ed3b03fa8210a08c205dacccd654f139f78f20623da": "698c638e1773244a6bf8a353c87d210047cce402",
|
||||
"1a7481f3e7e2d464772b540f9b9e4d529dc61df372f181adf7432f0df9876c16": "382292295c00dff348d7e17c5ce4da12a1d87763",
|
||||
"c0a5c744fffa9265fd3ee49020d0697717eaf5aa2fefacd0387ad997b1165b5a": "693f5b4fe1e5eb6429fd6614fb7bb14350939814",
|
||||
"06eae0519b66734b546d4a6508f8f20ab3f57d21819c469ff748e68816e27bce": "c7bf5fcfea0502011dca76d12efcc242e23421b9",
|
||||
"d7bb2d9b65a766dcc03376c6afd9a605df5fe302cf61584f801653b7be87279a": "e05575b630bea7ff98b9ca1f083d745abb3110b6",
|
||||
"a8bf18e99904f9c14969a3be1da84da2438ee3d206928ead28eaff758e4449dd": "a11d1801594fa3d1f95d37bbcc2e0faa1ad013c6",
|
||||
"c15d3d6732399a879bb6de5ae2fcb9aadfd64da86d95652ced9ad96a2ae8e692": "8d2865996a1a8d8a13fc9965c1bcf490f9621399",
|
||||
@@ -118813,7 +118914,8 @@
|
||||
"c5e08982bc797752118eff67950f42d9c6ef6b9668d03f152c88b8ef8ed6a63b": "d07114a9f3490338a265fb30d16b052c8da3bb7d",
|
||||
"c06a6ae0804b20ded47b9ab9101ffe3a6438382b9ec664a2ec0fcd010f8566f4": "b3730071e789877bea3373ffa59ca673a4b1f4c9",
|
||||
"37ed55d89afe24a013de30feecf21fb0d75c58f3f0ff9a8449098eaaabe75aac": "48024e2f5943ed86cb1b8e9443603991cdb05808",
|
||||
"7dc407fbccbf684dc677bed81120f45f0d3406ff7945eaf207a5c38b036c30e0": "24a487f22f3da292e179b3edd6c30222a8ff933d"
|
||||
"7dc407fbccbf684dc677bed81120f45f0d3406ff7945eaf207a5c38b036c30e0": "24a487f22f3da292e179b3edd6c30222a8ff933d",
|
||||
"0d6487d6832488130bc94b1ec5ee71766717b929c249693327089e461460ae40": "8c20ff26ebfefbf9b050b67af8083704003595ba"
|
||||
},
|
||||
"by_path_suffix": {
|
||||
".variants/aa310.zip": [
|
||||
@@ -124297,6 +124399,12 @@
|
||||
"Oric/colour.rom": [
|
||||
"bda81f64be319d8793d284bf9d40f01d19b33515"
|
||||
],
|
||||
"nxengine/data/sprites.sif": [
|
||||
"73acccee601b56a2b7f624b0227fa7e1d662ef4b"
|
||||
],
|
||||
"nxengine/tilekey.dat": [
|
||||
"74c14b15dbc2f36c81d2ad9cb65e2893298415da"
|
||||
],
|
||||
"nvr/adgold.bin": [
|
||||
"e3b28842515140c82e2e897a53ad39333ed9512c"
|
||||
],
|
||||
@@ -132582,6 +132690,7 @@
|
||||
"d3b78c3dbac55f5199f33f3fe0036439811f7fb3",
|
||||
"1983b4fb398e3dd9668d424c666c5a0b3f1e2b69",
|
||||
"e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e",
|
||||
"686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"6033a0535136c40c47137e4d1cd9273c06d5fdff",
|
||||
"81193965a374d77b99b4743d317824b53c3e3c78",
|
||||
"8f70d1b74483ba3a37e86cf16c849d601a8c3d2c",
|
||||
|
||||
@@ -238,6 +238,7 @@ files:
|
||||
- name: CARTS.CRC
|
||||
required: false
|
||||
bundled: false
|
||||
unsourceable: "dead legacy code path, never created or distributed, replaced by CARTS.SHA"
|
||||
note: "CRC database for cartridge identification and mapper detection. Tried first, before CARTS.SHA (fMSX/MSX.c:2697)."
|
||||
|
||||
- name: CARTS.SHA
|
||||
|
||||
@@ -186,6 +186,7 @@ files:
|
||||
path: "np2kai/gpib.rom"
|
||||
size: 8192
|
||||
required: false
|
||||
unsourceable: "never publicly dumped, GP-IB emulation is stub code (source comment: not implemented)"
|
||||
note: >
|
||||
GP-IB interface BIOS ROM (8 KB). If missing, GP-IB emulation
|
||||
is disabled entirely.
|
||||
@@ -198,6 +199,8 @@ files:
|
||||
- name: "key.txt"
|
||||
path: "np2kai/key.txt"
|
||||
required: false
|
||||
hle_fallback: true
|
||||
unsourceable: "user-created keyboard config, no default distributed in any NP2kai release"
|
||||
note: >
|
||||
Keyboard remapping configuration (text file). User-created file
|
||||
for custom keyboard layout. The core uses built-in defaults if absent.
|
||||
|
||||
@@ -81,5 +81,6 @@ files:
|
||||
system: cave-story
|
||||
description: "Tile attribute lookup table (maps tile codes to collision/behavior attributes)"
|
||||
required: false
|
||||
hle_fallback: true
|
||||
source_ref: "map.cpp:290-303 (loaded at init, hardcoded default if missing)"
|
||||
note: "Not part of the freeware distribution. Generated by the standalone NXEngine extraction tool. The libretro core has hardcoded defaults in map.cpp:30."
|
||||
|
||||
@@ -247,6 +247,7 @@ files:
|
||||
- name: "WHDLoad.key"
|
||||
system: commodore-amiga
|
||||
required: false
|
||||
unsourceable: "per-user signed registration key, never distributed generically, WHDLoad free since v18.2"
|
||||
note: "WHDLoad license key. Copied to saves/WHDLoad/L/ for registered WHDLoad use."
|
||||
source_ref: "libretro/libretro-core.c:5985-5998"
|
||||
|
||||
|
||||
@@ -251,6 +251,7 @@ files:
|
||||
- name: "WHDLoad.key"
|
||||
system: commodore-amiga
|
||||
required: false
|
||||
unsourceable: "per-user signed registration key, never distributed generically, WHDLoad free since v18.2"
|
||||
note: "WHDLoad license key. Copied to saves/WHDLoad/L/ for registered WHDLoad use."
|
||||
source_ref: "libretro/libretro-core.c:5903-5916"
|
||||
|
||||
|
||||
@@ -397,5 +397,6 @@ files:
|
||||
system: dragon64
|
||||
description: "Ikon Ultra Drive Dragonfly ROM 2.3"
|
||||
required: false
|
||||
unsourceable: "not yet dumped, only v1.3 publicly available, XRoar support is experimental (#ifdef WANT_EXPERIMENTAL)"
|
||||
source_ref: "xroar.c:715 (romlist ikon), ikon.c:151 (default @ikon)"
|
||||
note: "Experimental. Ikon Ultra Drive storage interface. Older version: dragonfly-1.3."
|
||||
|
||||
@@ -138,6 +138,8 @@ files:
|
||||
|
||||
- name: Custom.dat
|
||||
path: zc210/sfx/Custom.dat
|
||||
category: game_data
|
||||
description: user-provided custom SFX replacement
|
||||
required: false
|
||||
unsourceable: "user placeholder slot, README says 'rename your own SFX dat file to this name'"
|
||||
source_ref: "zelda.cpp:1193-1218, libretro.cpp:148"
|
||||
|
||||
46
install.ps1
46
install.ps1
@@ -101,4 +101,50 @@ foreach ($f in $toDownload) {
|
||||
}
|
||||
}
|
||||
|
||||
# Standalone emulator copies
|
||||
if ($manifest.standalone_copies) {
|
||||
Write-Host "`nStandalone emulators:"
|
||||
foreach ($entry in $manifest.standalone_copies) {
|
||||
if ($entry.note) {
|
||||
$detectPaths = @()
|
||||
if ($entry.detect -and $entry.detect.windows) {
|
||||
$detectPaths = $entry.detect.windows
|
||||
}
|
||||
foreach ($dp in $detectPaths) {
|
||||
$expanded = [Environment]::ExpandEnvironmentVariables($dp)
|
||||
if (Test-Path $expanded) {
|
||||
Write-Host " $($entry.note)"
|
||||
break
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
$sources = @()
|
||||
if ($entry.pattern) {
|
||||
$sources = Get-ChildItem -Path $biosPath -Filter $entry.pattern -File -ErrorAction SilentlyContinue
|
||||
} elseif ($entry.file) {
|
||||
$src = Join-Path $biosPath $entry.file
|
||||
if (Test-Path $src) { $sources = @(Get-Item $src) }
|
||||
}
|
||||
if ($sources.Count -eq 0) { continue }
|
||||
$targetDirs = @()
|
||||
if ($entry.targets -and $entry.targets.windows) {
|
||||
$targetDirs = $entry.targets.windows
|
||||
}
|
||||
foreach ($td in $targetDirs) {
|
||||
$expanded = [Environment]::ExpandEnvironmentVariables($td)
|
||||
if (-not (Test-Path $expanded)) { continue }
|
||||
foreach ($s in $sources) {
|
||||
$dest = Join-Path $expanded $s.Name
|
||||
try {
|
||||
Copy-Item $s.FullName $dest -Force
|
||||
Write-Host " $($s.Name) -> $expanded"
|
||||
} catch {
|
||||
Write-Host " $($s.Name) -> $expanded FAILED" -ForegroundColor Red
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host "`nDone. $downloaded downloaded, $upToDate already up to date."
|
||||
|
||||
49
install.py
49
install.py
@@ -192,9 +192,9 @@ def detect_platforms(os_type: str) -> list[tuple[str, Path]]:
|
||||
if retrodeck_cfg.exists():
|
||||
bios_path = _parse_bash_var(retrodeck_cfg, "rdhome")
|
||||
if bios_path:
|
||||
found.append(("retrodeck", Path(bios_path) / "bios"))
|
||||
found.append(("retrodeck", Path(bios_path)))
|
||||
else:
|
||||
found.append(("retrodeck", home / "retrodeck" / "bios"))
|
||||
found.append(("retrodeck", home / "retrodeck"))
|
||||
|
||||
# RetroArch Flatpak
|
||||
flatpak_cfg = home / ".var" / "app" / "org.libretro.RetroArch" / "config" / "retroarch" / "retroarch.cfg"
|
||||
@@ -390,8 +390,16 @@ def do_standalone_copies(
|
||||
) -> tuple[int, int]:
|
||||
"""Copy BIOS files to standalone emulator directories.
|
||||
|
||||
Supports:
|
||||
- file: single file copy
|
||||
- pattern: glob match (e.g. "scph*.bin")
|
||||
- note: informational message when detect path exists
|
||||
- WSL fallback to linux targets
|
||||
|
||||
Returns (copied_count, skipped_count).
|
||||
"""
|
||||
from fnmatch import fnmatch
|
||||
|
||||
copies = manifest.get("standalone_copies", [])
|
||||
if not copies:
|
||||
return 0, 0
|
||||
@@ -400,21 +408,48 @@ def do_standalone_copies(
|
||||
skipped = 0
|
||||
|
||||
for entry in copies:
|
||||
src = bios_path / entry["file"]
|
||||
if not src.exists():
|
||||
# Note entries: print message if emulator detected
|
||||
if "note" in entry:
|
||||
detect_paths = entry.get("detect", {}).get(os_type, [])
|
||||
if not detect_paths and os_type == "wsl":
|
||||
detect_paths = entry.get("detect", {}).get("linux", [])
|
||||
for dp in detect_paths:
|
||||
expanded = Path(os.path.expandvars(os.path.expanduser(dp)))
|
||||
if expanded.is_dir():
|
||||
print(f" {entry['note']}")
|
||||
break
|
||||
continue
|
||||
|
||||
# Resolve source files
|
||||
if "pattern" in entry:
|
||||
sources = [
|
||||
f for f in bios_path.rglob("*")
|
||||
if fnmatch(f.name, entry["pattern"]) and f.is_file()
|
||||
]
|
||||
else:
|
||||
src = bios_path / entry["file"]
|
||||
sources = [src] if src.exists() else []
|
||||
|
||||
if not sources:
|
||||
continue
|
||||
|
||||
# Resolve target directories with WSL fallback
|
||||
targets = entry.get("targets", {}).get(os_type, [])
|
||||
if not targets and os_type == "wsl":
|
||||
targets = entry.get("targets", {}).get("linux", [])
|
||||
|
||||
for target_dir_str in targets:
|
||||
target_dir = Path(os.path.expandvars(os.path.expanduser(target_dir_str)))
|
||||
if target_dir.is_dir():
|
||||
if not target_dir.is_dir():
|
||||
skipped += len(sources)
|
||||
continue
|
||||
for src in sources:
|
||||
dest = target_dir / src.name
|
||||
try:
|
||||
shutil.copy2(src, dest)
|
||||
copied += 1
|
||||
except OSError:
|
||||
skipped += 1
|
||||
else:
|
||||
skipped += 1
|
||||
|
||||
return copied, skipped
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "batocera",
|
||||
"display_name": "Batocera",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-02T08:32:09Z",
|
||||
"generated": "2026-04-03T09:43:11Z",
|
||||
"base_destination": "bios",
|
||||
"detect": [
|
||||
{
|
||||
@@ -14,9 +14,224 @@
|
||||
"bios_path": "/userdata/bios"
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 1541,
|
||||
"total_size": 3891648039,
|
||||
"standalone_copies": [
|
||||
{
|
||||
"file": "prod.keys",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/yuzu/keys",
|
||||
"$HOME/.local/share/eden/keys",
|
||||
"$HOME/.local/share/citron/keys",
|
||||
"$HOME/.local/share/suyu/keys",
|
||||
"$HOME/.config/Ryujinx/system"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\yuzu\\keys",
|
||||
"%APPDATA%\\eden\\keys",
|
||||
"%APPDATA%\\citron\\keys",
|
||||
"%APPDATA%\\suyu\\keys",
|
||||
"%APPDATA%\\Ryujinx\\system"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/yuzu/keys",
|
||||
"$HOME/Library/Application Support/Ryujinx/system"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "title.keys",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/yuzu/keys",
|
||||
"$HOME/.local/share/eden/keys",
|
||||
"$HOME/.local/share/citron/keys",
|
||||
"$HOME/.local/share/suyu/keys"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\yuzu\\keys",
|
||||
"%APPDATA%\\eden\\keys",
|
||||
"%APPDATA%\\citron\\keys",
|
||||
"%APPDATA%\\suyu\\keys"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/yuzu/keys"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "Citra/sysdata/aes_keys.txt",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/azahar/sysdata"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Azahar\\sysdata"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "Citra/sysdata/boot9.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/azahar/sysdata"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Azahar\\sysdata"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"pattern": "scph*.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/duckstation/bios"
|
||||
],
|
||||
"windows": [
|
||||
"%LOCALAPPDATA%\\DuckStation\\bios",
|
||||
"%USERPROFILE%\\Documents\\DuckStation\\bios"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/DuckStation/bios"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"pattern": "ps2-*.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.config/PCSX2/bios",
|
||||
"$HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios"
|
||||
],
|
||||
"windows": [
|
||||
"%USERPROFILE%\\Documents\\PCSX2\\bios"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/PCSX2/bios"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"note": "PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.",
|
||||
"detect": {
|
||||
"linux": [
|
||||
"$HOME/.config/rpcs3"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\rpcs3"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/USA/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/USA"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\USA"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/USA"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/EUR/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/EUR"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\EUR"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/EUR"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/JAP/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/JAP"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\JAP"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/JAP"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dsp_rom.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dsp_coef.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "PPSSPP/ppge_atlas.zim",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.config/ppsspp/PSP/SYSTEM"
|
||||
],
|
||||
"windows": [
|
||||
"%USERPROFILE%\\Documents\\PPSSPP\\PSP\\SYSTEM"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/PPSSPP/PSP/SYSTEM"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dc/dc_boot.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/flycast/data",
|
||||
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\flycast\\data"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dc/dc_nvmem.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/flycast/data",
|
||||
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\flycast\\data"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"total_files": 1547,
|
||||
"total_size": 4371484317,
|
||||
"files": [
|
||||
{
|
||||
"dest": "panafz1.bin",
|
||||
@@ -6157,6 +6372,39 @@
|
||||
"FinalBurn Neo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "gamegenie.nes",
|
||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||
@@ -8398,6 +8646,24 @@
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/data/sprites.sif",
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"size": 59482,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/tilekey.dat",
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"size": 1028,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "NMS8245SystemROM1.08.bin",
|
||||
"sha1": "cc57c1dcd7249ea9f8e2547244592e7d97308ed0",
|
||||
@@ -10666,6 +10932,15 @@
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "delta2.rom",
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"size": 8192,
|
||||
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"cores": [
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "cp450dsk.rom",
|
||||
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "bizhawk",
|
||||
"display_name": "BizHawk",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-01T14:00:10Z",
|
||||
"generated": "2026-04-02T13:52:21Z",
|
||||
"base_destination": "Firmware",
|
||||
"detect": [
|
||||
{
|
||||
@@ -19,8 +19,8 @@
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 527,
|
||||
"total_size": 2068127713,
|
||||
"total_files": 530,
|
||||
"total_size": 2547895289,
|
||||
"files": [
|
||||
{
|
||||
"dest": "panafz1.bin",
|
||||
@@ -1274,6 +1274,39 @@
|
||||
"FinalBurn Neo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "sl31253.bin",
|
||||
"sha1": "81193965a374d77b99b4743d317824b53c3e3c78",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "emudeck",
|
||||
"display_name": "EmuDeck",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-01T14:41:53Z",
|
||||
"generated": "2026-04-03T09:43:22Z",
|
||||
"base_destination": "bios",
|
||||
"detect": [
|
||||
{
|
||||
@@ -34,19 +34,211 @@
|
||||
"linux": [
|
||||
"$HOME/.local/share/yuzu/keys",
|
||||
"$HOME/.local/share/eden/keys",
|
||||
"$HOME/.local/share/citron/keys",
|
||||
"$HOME/.local/share/suyu/keys",
|
||||
"$HOME/.config/Ryujinx/system"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\yuzu\\keys",
|
||||
"%APPDATA%\\eden\\keys"
|
||||
"%APPDATA%\\eden\\keys",
|
||||
"%APPDATA%\\citron\\keys",
|
||||
"%APPDATA%\\suyu\\keys",
|
||||
"%APPDATA%\\Ryujinx\\system"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/yuzu/keys",
|
||||
"$HOME/Library/Application Support/Ryujinx/system"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "aes_keys.txt",
|
||||
"file": "title.keys",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/Emulation/bios/citra/keys"
|
||||
"$HOME/.local/share/yuzu/keys",
|
||||
"$HOME/.local/share/eden/keys",
|
||||
"$HOME/.local/share/citron/keys",
|
||||
"$HOME/.local/share/suyu/keys"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\yuzu\\keys",
|
||||
"%APPDATA%\\eden\\keys",
|
||||
"%APPDATA%\\citron\\keys",
|
||||
"%APPDATA%\\suyu\\keys"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/yuzu/keys"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "Citra/sysdata/aes_keys.txt",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/azahar/sysdata"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Azahar\\sysdata"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "Citra/sysdata/boot9.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/azahar/sysdata"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Azahar\\sysdata"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"pattern": "scph*.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/duckstation/bios"
|
||||
],
|
||||
"windows": [
|
||||
"%LOCALAPPDATA%\\DuckStation\\bios",
|
||||
"%USERPROFILE%\\Documents\\DuckStation\\bios"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/DuckStation/bios"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"pattern": "ps2-*.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.config/PCSX2/bios",
|
||||
"$HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios"
|
||||
],
|
||||
"windows": [
|
||||
"%USERPROFILE%\\Documents\\PCSX2\\bios"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/PCSX2/bios"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"note": "PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.",
|
||||
"detect": {
|
||||
"linux": [
|
||||
"$HOME/.config/rpcs3"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\rpcs3"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/USA/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/USA"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\USA"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/USA"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/EUR/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/EUR"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\EUR"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/EUR"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/JAP/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/JAP"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\JAP"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/JAP"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dsp_rom.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dsp_coef.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "PPSSPP/ppge_atlas.zim",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.config/ppsspp/PSP/SYSTEM"
|
||||
],
|
||||
"windows": [
|
||||
"%USERPROFILE%\\Documents\\PPSSPP\\PSP\\SYSTEM"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/PPSSPP/PSP/SYSTEM"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dc/dc_boot.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/flycast/data",
|
||||
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\flycast\\data"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dc/dc_nvmem.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/flycast/data",
|
||||
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\flycast\\data"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "lakka",
|
||||
"display_name": "Lakka",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-02T08:32:35Z",
|
||||
"generated": "2026-04-02T13:52:45Z",
|
||||
"base_destination": "system",
|
||||
"detect": [
|
||||
{
|
||||
@@ -15,8 +15,8 @@
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 1621,
|
||||
"total_size": 5255390792,
|
||||
"total_files": 1627,
|
||||
"total_size": 5735234905,
|
||||
"files": [
|
||||
{
|
||||
"dest": "3do_arcade_saot.bin",
|
||||
@@ -5079,6 +5079,39 @@
|
||||
"storage": "release",
|
||||
"release_asset": "vimana.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "nes.pal",
|
||||
"sha1": "37027d92e1015b82a7dc5c43e9f1649a961577ab",
|
||||
@@ -7871,6 +7904,24 @@
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/data/sprites.sif",
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"size": 59482,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/tilekey.dat",
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"size": 1028,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "mda.rom",
|
||||
"sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f",
|
||||
@@ -9659,6 +9710,15 @@
|
||||
"SameBoy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "sdlpal/desc.dat",
|
||||
"sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba",
|
||||
"size": 16027,
|
||||
"repo_path": "bios/sdlpal/desc.dat",
|
||||
"cores": [
|
||||
"SDLPAL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "SkyEmu/dmg_rom.bin",
|
||||
"sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "recalbox",
|
||||
"display_name": "Recalbox",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-02T08:33:02Z",
|
||||
"generated": "2026-04-03T09:44:06Z",
|
||||
"base_destination": "bios",
|
||||
"detect": [
|
||||
{
|
||||
@@ -14,9 +14,224 @@
|
||||
"bios_path": "/recalbox/share/bios"
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 1098,
|
||||
"total_size": 3500175098,
|
||||
"standalone_copies": [
|
||||
{
|
||||
"file": "prod.keys",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/yuzu/keys",
|
||||
"$HOME/.local/share/eden/keys",
|
||||
"$HOME/.local/share/citron/keys",
|
||||
"$HOME/.local/share/suyu/keys",
|
||||
"$HOME/.config/Ryujinx/system"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\yuzu\\keys",
|
||||
"%APPDATA%\\eden\\keys",
|
||||
"%APPDATA%\\citron\\keys",
|
||||
"%APPDATA%\\suyu\\keys",
|
||||
"%APPDATA%\\Ryujinx\\system"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/yuzu/keys",
|
||||
"$HOME/Library/Application Support/Ryujinx/system"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "title.keys",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/yuzu/keys",
|
||||
"$HOME/.local/share/eden/keys",
|
||||
"$HOME/.local/share/citron/keys",
|
||||
"$HOME/.local/share/suyu/keys"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\yuzu\\keys",
|
||||
"%APPDATA%\\eden\\keys",
|
||||
"%APPDATA%\\citron\\keys",
|
||||
"%APPDATA%\\suyu\\keys"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/yuzu/keys"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "Citra/sysdata/aes_keys.txt",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/azahar/sysdata"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Azahar\\sysdata"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "Citra/sysdata/boot9.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/azahar/sysdata"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Azahar\\sysdata"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"pattern": "scph*.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/duckstation/bios"
|
||||
],
|
||||
"windows": [
|
||||
"%LOCALAPPDATA%\\DuckStation\\bios",
|
||||
"%USERPROFILE%\\Documents\\DuckStation\\bios"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/DuckStation/bios"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"pattern": "ps2-*.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.config/PCSX2/bios",
|
||||
"$HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios"
|
||||
],
|
||||
"windows": [
|
||||
"%USERPROFILE%\\Documents\\PCSX2\\bios"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/PCSX2/bios"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"note": "PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.",
|
||||
"detect": {
|
||||
"linux": [
|
||||
"$HOME/.config/rpcs3"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\rpcs3"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/USA/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/USA"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\USA"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/USA"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/EUR/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/EUR"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\EUR"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/EUR"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/JAP/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/JAP"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\JAP"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/JAP"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dsp_rom.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dsp_coef.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "PPSSPP/ppge_atlas.zim",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.config/ppsspp/PSP/SYSTEM"
|
||||
],
|
||||
"windows": [
|
||||
"%USERPROFILE%\\Documents\\PPSSPP\\PSP\\SYSTEM"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/PPSSPP/PSP/SYSTEM"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dc/dc_boot.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/flycast/data",
|
||||
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\flycast\\data"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dc/dc_nvmem.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/flycast/data",
|
||||
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\flycast\\data"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"total_files": 1107,
|
||||
"total_size": 3980096655,
|
||||
"files": [
|
||||
{
|
||||
"dest": "3do/panafz1.bin",
|
||||
@@ -540,7 +755,7 @@
|
||||
"dest": "dragon/deltados.rom",
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"size": 8192,
|
||||
"repo_path": "bios/Dragon/Dragon/deltados.rom",
|
||||
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"cores": null
|
||||
},
|
||||
{
|
||||
@@ -3804,6 +4019,39 @@
|
||||
"FinalBurn Neo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "gamegenie.nes",
|
||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||
@@ -6459,6 +6707,24 @@
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/data/sprites.sif",
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"size": 59482,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/tilekey.dat",
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"size": 1028,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "64DD_IPL.bin",
|
||||
"sha1": "bf861922dcb78c316360e3e742f4f70ff63c9bc3",
|
||||
@@ -6828,6 +7094,33 @@
|
||||
"Stella 2023"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "Gram Kracker.ctg",
|
||||
"sha1": "56dd520570cdcdd60dda2eedc8af1e02a781dcc5",
|
||||
"size": 7587,
|
||||
"repo_path": "bios/Texas Instruments/TI-99/Gram Kracker.ctg",
|
||||
"cores": [
|
||||
"ti99sim"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "ti-pcard.ctg",
|
||||
"sha1": "c7bf5fcfea0502011dca76d12efcc242e23421b9",
|
||||
"size": 71924,
|
||||
"repo_path": "bios/Texas Instruments/TI-99/ti-pcard.ctg",
|
||||
"cores": [
|
||||
"ti99sim"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "cf7+.ctg",
|
||||
"sha1": "698c638e1773244a6bf8a353c87d210047cce402",
|
||||
"size": 5768,
|
||||
"repo_path": "bios/Texas Instruments/TI-99/cf7+.ctg",
|
||||
"cores": [
|
||||
"ti99sim"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "JiffyDOS_SX-64.bin",
|
||||
"sha1": "942c2150123dc30f40b3df6086132ef0a3c43948",
|
||||
@@ -7053,6 +7346,15 @@
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "delta2.rom",
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"size": 8192,
|
||||
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"cores": [
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "cp450dsk.rom",
|
||||
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "retroarch",
|
||||
"display_name": "RetroArch",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-02T08:32:35Z",
|
||||
"generated": "2026-04-03T09:43:38Z",
|
||||
"base_destination": "system",
|
||||
"detect": [
|
||||
{
|
||||
@@ -32,9 +32,224 @@
|
||||
"parse_key": "system_directory"
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 1621,
|
||||
"total_size": 5255390792,
|
||||
"standalone_copies": [
|
||||
{
|
||||
"file": "prod.keys",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/yuzu/keys",
|
||||
"$HOME/.local/share/eden/keys",
|
||||
"$HOME/.local/share/citron/keys",
|
||||
"$HOME/.local/share/suyu/keys",
|
||||
"$HOME/.config/Ryujinx/system"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\yuzu\\keys",
|
||||
"%APPDATA%\\eden\\keys",
|
||||
"%APPDATA%\\citron\\keys",
|
||||
"%APPDATA%\\suyu\\keys",
|
||||
"%APPDATA%\\Ryujinx\\system"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/yuzu/keys",
|
||||
"$HOME/Library/Application Support/Ryujinx/system"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "title.keys",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/yuzu/keys",
|
||||
"$HOME/.local/share/eden/keys",
|
||||
"$HOME/.local/share/citron/keys",
|
||||
"$HOME/.local/share/suyu/keys"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\yuzu\\keys",
|
||||
"%APPDATA%\\eden\\keys",
|
||||
"%APPDATA%\\citron\\keys",
|
||||
"%APPDATA%\\suyu\\keys"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/yuzu/keys"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "Citra/sysdata/aes_keys.txt",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/azahar/sysdata"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Azahar\\sysdata"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "Citra/sysdata/boot9.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/azahar/sysdata"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Azahar\\sysdata"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"pattern": "scph*.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/duckstation/bios"
|
||||
],
|
||||
"windows": [
|
||||
"%LOCALAPPDATA%\\DuckStation\\bios",
|
||||
"%USERPROFILE%\\Documents\\DuckStation\\bios"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/DuckStation/bios"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"pattern": "ps2-*.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.config/PCSX2/bios",
|
||||
"$HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios"
|
||||
],
|
||||
"windows": [
|
||||
"%USERPROFILE%\\Documents\\PCSX2\\bios"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/PCSX2/bios"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"note": "PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.",
|
||||
"detect": {
|
||||
"linux": [
|
||||
"$HOME/.config/rpcs3"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\rpcs3"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/USA/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/USA"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\USA"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/USA"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/EUR/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/EUR"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\EUR"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/EUR"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/JAP/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/JAP"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\JAP"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/JAP"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dsp_rom.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dsp_coef.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "PPSSPP/ppge_atlas.zim",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.config/ppsspp/PSP/SYSTEM"
|
||||
],
|
||||
"windows": [
|
||||
"%USERPROFILE%\\Documents\\PPSSPP\\PSP\\SYSTEM"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/PPSSPP/PSP/SYSTEM"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dc/dc_boot.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/flycast/data",
|
||||
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\flycast\\data"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dc/dc_nvmem.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/flycast/data",
|
||||
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\flycast\\data"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"total_files": 1627,
|
||||
"total_size": 5735234905,
|
||||
"files": [
|
||||
{
|
||||
"dest": "3do_arcade_saot.bin",
|
||||
@@ -5097,6 +5312,39 @@
|
||||
"storage": "release",
|
||||
"release_asset": "vimana.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "nes.pal",
|
||||
"sha1": "37027d92e1015b82a7dc5c43e9f1649a961577ab",
|
||||
@@ -7889,6 +8137,24 @@
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/data/sprites.sif",
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"size": 59482,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/tilekey.dat",
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"size": 1028,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "mda.rom",
|
||||
"sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f",
|
||||
@@ -9677,6 +9943,15 @@
|
||||
"SameBoy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "sdlpal/desc.dat",
|
||||
"sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba",
|
||||
"size": 16027,
|
||||
"repo_path": "bios/sdlpal/desc.dat",
|
||||
"cores": [
|
||||
"SDLPAL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "SkyEmu/dmg_rom.bin",
|
||||
"sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "retrobat",
|
||||
"display_name": "RetroBat",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-02T08:33:12Z",
|
||||
"generated": "2026-04-03T09:44:16Z",
|
||||
"base_destination": "bios",
|
||||
"detect": [
|
||||
{
|
||||
@@ -13,9 +13,224 @@
|
||||
"path": "%USERPROFILE%\\RetroBat\\bios"
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 1163,
|
||||
"total_size": 4297804943,
|
||||
"standalone_copies": [
|
||||
{
|
||||
"file": "prod.keys",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/yuzu/keys",
|
||||
"$HOME/.local/share/eden/keys",
|
||||
"$HOME/.local/share/citron/keys",
|
||||
"$HOME/.local/share/suyu/keys",
|
||||
"$HOME/.config/Ryujinx/system"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\yuzu\\keys",
|
||||
"%APPDATA%\\eden\\keys",
|
||||
"%APPDATA%\\citron\\keys",
|
||||
"%APPDATA%\\suyu\\keys",
|
||||
"%APPDATA%\\Ryujinx\\system"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/yuzu/keys",
|
||||
"$HOME/Library/Application Support/Ryujinx/system"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "title.keys",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/yuzu/keys",
|
||||
"$HOME/.local/share/eden/keys",
|
||||
"$HOME/.local/share/citron/keys",
|
||||
"$HOME/.local/share/suyu/keys"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\yuzu\\keys",
|
||||
"%APPDATA%\\eden\\keys",
|
||||
"%APPDATA%\\citron\\keys",
|
||||
"%APPDATA%\\suyu\\keys"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/yuzu/keys"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "Citra/sysdata/aes_keys.txt",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/azahar/sysdata"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Azahar\\sysdata"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "Citra/sysdata/boot9.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/azahar/sysdata"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Azahar\\sysdata"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"pattern": "scph*.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/duckstation/bios"
|
||||
],
|
||||
"windows": [
|
||||
"%LOCALAPPDATA%\\DuckStation\\bios",
|
||||
"%USERPROFILE%\\Documents\\DuckStation\\bios"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/DuckStation/bios"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"pattern": "ps2-*.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.config/PCSX2/bios",
|
||||
"$HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios"
|
||||
],
|
||||
"windows": [
|
||||
"%USERPROFILE%\\Documents\\PCSX2\\bios"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/PCSX2/bios"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"note": "PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.",
|
||||
"detect": {
|
||||
"linux": [
|
||||
"$HOME/.config/rpcs3"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\rpcs3"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/USA/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/USA"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\USA"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/USA"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/EUR/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/EUR"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\EUR"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/EUR"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/JAP/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/JAP"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\JAP"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/JAP"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dsp_rom.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dsp_coef.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "PPSSPP/ppge_atlas.zim",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.config/ppsspp/PSP/SYSTEM"
|
||||
],
|
||||
"windows": [
|
||||
"%USERPROFILE%\\Documents\\PPSSPP\\PSP\\SYSTEM"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/PPSSPP/PSP/SYSTEM"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dc/dc_boot.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/flycast/data",
|
||||
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\flycast\\data"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dc/dc_nvmem.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/flycast/data",
|
||||
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\flycast\\data"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"total_files": 1169,
|
||||
"total_size": 4777641221,
|
||||
"files": [
|
||||
{
|
||||
"dest": "panafz1.bin",
|
||||
@@ -3977,6 +4192,39 @@
|
||||
"storage": "release",
|
||||
"release_asset": "vimana.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "gamegenie.nes",
|
||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||
@@ -6200,6 +6448,24 @@
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/data/sprites.sif",
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"size": 59482,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/tilekey.dat",
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"size": 1028,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "panafz1j.bin",
|
||||
"sha1": "ec7ec62d60ec0459a14ed56ebc66761ef3c80efc",
|
||||
@@ -7448,6 +7714,15 @@
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "delta2.rom",
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"size": 8192,
|
||||
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"cores": [
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "cp450dsk.rom",
|
||||
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
||||
|
||||
@@ -4,19 +4,234 @@
|
||||
"platform": "retrodeck",
|
||||
"display_name": "RetroDECK",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-02T08:33:28Z",
|
||||
"generated": "2026-04-03T09:44:33Z",
|
||||
"base_destination": "",
|
||||
"detect": [
|
||||
{
|
||||
"os": "linux",
|
||||
"method": "path_exists",
|
||||
"path": "$HOME/.var/app/net.retrodeck.retrodeck",
|
||||
"bios_path": "$HOME/retrodeck/bios"
|
||||
"bios_path": "$HOME/retrodeck"
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 3146,
|
||||
"total_size": 5871648429,
|
||||
"standalone_copies": [
|
||||
{
|
||||
"file": "prod.keys",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/yuzu/keys",
|
||||
"$HOME/.local/share/eden/keys",
|
||||
"$HOME/.local/share/citron/keys",
|
||||
"$HOME/.local/share/suyu/keys",
|
||||
"$HOME/.config/Ryujinx/system"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\yuzu\\keys",
|
||||
"%APPDATA%\\eden\\keys",
|
||||
"%APPDATA%\\citron\\keys",
|
||||
"%APPDATA%\\suyu\\keys",
|
||||
"%APPDATA%\\Ryujinx\\system"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/yuzu/keys",
|
||||
"$HOME/Library/Application Support/Ryujinx/system"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "title.keys",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/yuzu/keys",
|
||||
"$HOME/.local/share/eden/keys",
|
||||
"$HOME/.local/share/citron/keys",
|
||||
"$HOME/.local/share/suyu/keys"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\yuzu\\keys",
|
||||
"%APPDATA%\\eden\\keys",
|
||||
"%APPDATA%\\citron\\keys",
|
||||
"%APPDATA%\\suyu\\keys"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/yuzu/keys"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "Citra/sysdata/aes_keys.txt",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/azahar/sysdata"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Azahar\\sysdata"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "Citra/sysdata/boot9.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/azahar/sysdata"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Azahar\\sysdata"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"pattern": "scph*.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/duckstation/bios"
|
||||
],
|
||||
"windows": [
|
||||
"%LOCALAPPDATA%\\DuckStation\\bios",
|
||||
"%USERPROFILE%\\Documents\\DuckStation\\bios"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/DuckStation/bios"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"pattern": "ps2-*.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.config/PCSX2/bios",
|
||||
"$HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios"
|
||||
],
|
||||
"windows": [
|
||||
"%USERPROFILE%\\Documents\\PCSX2\\bios"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/PCSX2/bios"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"note": "PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.",
|
||||
"detect": {
|
||||
"linux": [
|
||||
"$HOME/.config/rpcs3"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\rpcs3"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/USA/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/USA"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\USA"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/USA"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/EUR/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/EUR"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\EUR"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/EUR"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "GC/JAP/IPL.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu/GC/JAP"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator\\GC\\JAP"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin/GC/JAP"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dsp_rom.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dsp_coef.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/dolphin-emu"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\Dolphin Emulator"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/Dolphin"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "PPSSPP/ppge_atlas.zim",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.config/ppsspp/PSP/SYSTEM"
|
||||
],
|
||||
"windows": [
|
||||
"%USERPROFILE%\\Documents\\PPSSPP\\PSP\\SYSTEM"
|
||||
],
|
||||
"darwin": [
|
||||
"$HOME/Library/Application Support/PPSSPP/PSP/SYSTEM"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dc/dc_boot.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/flycast/data",
|
||||
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\flycast\\data"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"file": "dc/dc_nvmem.bin",
|
||||
"targets": {
|
||||
"linux": [
|
||||
"$HOME/.local/share/flycast/data",
|
||||
"$HOME/.var/app/org.flycast.Flycast/data/flycast"
|
||||
],
|
||||
"windows": [
|
||||
"%APPDATA%\\flycast\\data"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"total_files": 3153,
|
||||
"total_size": 6351500734,
|
||||
"files": [
|
||||
{
|
||||
"dest": "bios/panafz1.bin",
|
||||
@@ -11082,7 +11297,7 @@
|
||||
"dest": "bios/deltados.rom",
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"size": 8192,
|
||||
"repo_path": "bios/Dragon/Dragon/deltados.rom",
|
||||
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"cores": null
|
||||
},
|
||||
{
|
||||
@@ -16297,6 +16512,39 @@
|
||||
"storage": "release",
|
||||
"release_asset": "vimana.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "gamegenie.nes",
|
||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||
@@ -18263,6 +18511,24 @@
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/data/sprites.sif",
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"size": 59482,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/tilekey.dat",
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"size": 1028,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "mda.rom",
|
||||
"sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f",
|
||||
@@ -20044,6 +20310,15 @@
|
||||
"SameBoy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "sdlpal/desc.dat",
|
||||
"sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba",
|
||||
"size": 16027,
|
||||
"repo_path": "bios/sdlpal/desc.dat",
|
||||
"cores": [
|
||||
"SDLPAL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "SkyEmu/dmg_rom.bin",
|
||||
"sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||
@@ -21740,6 +22015,15 @@
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "delta2.rom",
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"size": 8192,
|
||||
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"cores": [
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "cp450dsk.rom",
|
||||
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "romm",
|
||||
"display_name": "RomM",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-01T14:43:09Z",
|
||||
"generated": "2026-04-02T13:53:45Z",
|
||||
"base_destination": "bios",
|
||||
"detect": [
|
||||
{
|
||||
@@ -14,8 +14,8 @@
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 535,
|
||||
"total_size": 1076531155,
|
||||
"total_files": 538,
|
||||
"total_size": 1556298731,
|
||||
"files": [
|
||||
{
|
||||
"dest": "3do/3do_arcade_saot.bin",
|
||||
@@ -2796,6 +2796,39 @@
|
||||
"ep128emu-core"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "colecovision/fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "colecovision/fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "colecovision/fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fds/gamegenie.nes",
|
||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||
|
||||
@@ -20,6 +20,8 @@ theme:
|
||||
icon: material/brightness-4
|
||||
name: Switch to auto
|
||||
font: false
|
||||
logo: assets/images/logo.png
|
||||
favicon: assets/images/favicon.png
|
||||
icon:
|
||||
logo: material/chip
|
||||
features:
|
||||
@@ -52,6 +54,7 @@ plugins:
|
||||
- search
|
||||
nav:
|
||||
- Home: index.md
|
||||
- Which pack?: which-pack.md
|
||||
- Platforms:
|
||||
- Overview: platforms/index.md
|
||||
- Batocera: platforms/batocera.md
|
||||
@@ -138,6 +141,7 @@ nav:
|
||||
- VTech: systems/vtech.md
|
||||
- Vircon: systems/vircon.md
|
||||
- ZC: systems/zc.md
|
||||
- sdlpal: systems/sdlpal.md
|
||||
- Emulators:
|
||||
- Overview: emulators/index.md
|
||||
- Official ports (63):
|
||||
@@ -479,4 +483,5 @@ nav:
|
||||
- Adding a scraper: wiki/adding-a-scraper.md
|
||||
- Testing guide: wiki/testing-guide.md
|
||||
- Release process: wiki/release-process.md
|
||||
- Community tools: wiki/community-tools.md
|
||||
- Contributing: contributing.md
|
||||
|
||||
@@ -150,22 +150,23 @@ data_directories:
|
||||
description: "SDLPAL Chinese Paladin game data (.mkf archives)"
|
||||
|
||||
# ref: OpenTyrian2000 — system/opentyrian/tyrian/
|
||||
# Tyrian 2.1 freeware data (also on buildbot as OpenTyrian.zip)
|
||||
# Tyrian 2.1 freeware data (buildbot URLs removed, sourced from release asset)
|
||||
opentyrian:
|
||||
source_url: "https://buildbot.libretro.com/assets/system/OpenTyrian%20%28Game%20Data%29.zip"
|
||||
source_url: "https://github.com/Abdess/retrobios/releases/download/large-files/opentyrian-data.zip"
|
||||
source_type: zip
|
||||
for_platforms: [retroarch, lakka, retropie]
|
||||
local_cache: data/opentyrian
|
||||
description: "OpenTyrian Tyrian 2.1 freeware game data"
|
||||
|
||||
# ref: syobonaction — system/syobonaction/
|
||||
# Freeware game data from OpenSyobonAction
|
||||
# Freeware game data from OpenSyobonAction (BGM, res, SE directories)
|
||||
syobonaction:
|
||||
source_url: "https://github.com/akemin-dayo/OpenSyobonAction"
|
||||
source_type: git_subtree
|
||||
source_path: "res"
|
||||
source_url: "https://github.com/akemin-dayo/OpenSyobonAction/archive/refs/heads/{version}.tar.gz"
|
||||
source_type: tarball
|
||||
source_path: "OpenSyobonAction-master"
|
||||
version: master
|
||||
local_cache: data/syobonaction
|
||||
exclude: [DxLib.cpp, DxLib.h, icon.ico, joyconfig.h, loadg.cpp, main.cpp, main.h, Makefile, README_ja.md, README.md]
|
||||
description: "Syobon Action (Cat Mario) game data (sprites, BGM, SE)"
|
||||
|
||||
# =========================================================================
|
||||
@@ -190,9 +191,10 @@ data_directories:
|
||||
# Not on buildbot — sourced from libretro repo
|
||||
# 532 files (tiles, fonts, databases, lua scripts, level descriptions)
|
||||
stonesoup:
|
||||
source_url: "https://github.com/libretro/crawl-ref"
|
||||
source_type: git_subtree
|
||||
source_path: "crawl-ref/source/dat"
|
||||
source_url: "https://github.com/libretro/crawl-ref/archive/refs/heads/{version}.tar.gz"
|
||||
source_type: tarball
|
||||
source_path: "crawl-ref-master/crawl-ref/source/dat"
|
||||
version: master
|
||||
local_cache: data/stonesoup
|
||||
description: "DCSS game data (tiles, fonts, databases, lua, level descriptions)"
|
||||
|
||||
|
||||
@@ -32,6 +32,144 @@ platforms:
|
||||
method: config_file
|
||||
config: '%APPDATA%\RetroArch\retroarch.cfg'
|
||||
parse_key: system_directory
|
||||
standalone_copies:
|
||||
# Switch emulators (keys)
|
||||
- file: prod.keys
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/yuzu/keys
|
||||
- $HOME/.local/share/eden/keys
|
||||
- $HOME/.local/share/citron/keys
|
||||
- $HOME/.local/share/suyu/keys
|
||||
- $HOME/.config/Ryujinx/system
|
||||
windows:
|
||||
- '%APPDATA%\yuzu\keys'
|
||||
- '%APPDATA%\eden\keys'
|
||||
- '%APPDATA%\citron\keys'
|
||||
- '%APPDATA%\suyu\keys'
|
||||
- '%APPDATA%\Ryujinx\system'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/yuzu/keys
|
||||
- $HOME/Library/Application Support/Ryujinx/system
|
||||
- file: title.keys
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/yuzu/keys
|
||||
- $HOME/.local/share/eden/keys
|
||||
- $HOME/.local/share/citron/keys
|
||||
- $HOME/.local/share/suyu/keys
|
||||
windows:
|
||||
- '%APPDATA%\yuzu\keys'
|
||||
- '%APPDATA%\eden\keys'
|
||||
- '%APPDATA%\citron\keys'
|
||||
- '%APPDATA%\suyu\keys'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/yuzu/keys
|
||||
# 3DS emulators
|
||||
- file: Citra/sysdata/aes_keys.txt
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/azahar/sysdata
|
||||
windows:
|
||||
- '%APPDATA%\Azahar\sysdata'
|
||||
- file: Citra/sysdata/boot9.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/azahar/sysdata
|
||||
windows:
|
||||
- '%APPDATA%\Azahar\sysdata'
|
||||
# DuckStation (PS1)
|
||||
- pattern: 'scph*.bin'
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/duckstation/bios
|
||||
windows:
|
||||
- '%LOCALAPPDATA%\DuckStation\bios'
|
||||
- '%USERPROFILE%\Documents\DuckStation\bios'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/DuckStation/bios
|
||||
# PCSX2 (PS2)
|
||||
- pattern: 'ps2-*.bin'
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.config/PCSX2/bios
|
||||
- $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios
|
||||
windows:
|
||||
- '%USERPROFILE%\Documents\PCSX2\bios'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/PCSX2/bios
|
||||
# RPCS3 (PS3) - needs menu install
|
||||
- note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.'
|
||||
detect:
|
||||
linux:
|
||||
- $HOME/.config/rpcs3
|
||||
windows:
|
||||
- '%APPDATA%\rpcs3'
|
||||
# Dolphin (GameCube)
|
||||
- file: GC/USA/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/USA
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\USA'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/USA
|
||||
- file: GC/EUR/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/EUR
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\EUR'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/EUR
|
||||
- file: GC/JAP/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/JAP
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\JAP'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/JAP
|
||||
- file: dsp_rom.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin
|
||||
- file: dsp_coef.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin
|
||||
# PPSSPP
|
||||
- file: PPSSPP/ppge_atlas.zim
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.config/ppsspp/PSP/SYSTEM
|
||||
windows:
|
||||
- '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM
|
||||
# Flycast (Dreamcast)
|
||||
- file: dc/dc_boot.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/flycast/data
|
||||
- $HOME/.var/app/org.flycast.Flycast/data/flycast
|
||||
windows:
|
||||
- '%APPDATA%\flycast\data'
|
||||
- file: dc/dc_nvmem.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/flycast/data
|
||||
- $HOME/.var/app/org.flycast.Flycast/data/flycast
|
||||
windows:
|
||||
- '%APPDATA%\flycast\data'
|
||||
batocera:
|
||||
config: batocera.yml
|
||||
status: active
|
||||
@@ -256,6 +394,144 @@ platforms:
|
||||
method: file_exists
|
||||
file: /etc/batocera-version
|
||||
bios_path: /userdata/bios
|
||||
standalone_copies:
|
||||
# Switch emulators (keys)
|
||||
- file: prod.keys
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/yuzu/keys
|
||||
- $HOME/.local/share/eden/keys
|
||||
- $HOME/.local/share/citron/keys
|
||||
- $HOME/.local/share/suyu/keys
|
||||
- $HOME/.config/Ryujinx/system
|
||||
windows:
|
||||
- '%APPDATA%\yuzu\keys'
|
||||
- '%APPDATA%\eden\keys'
|
||||
- '%APPDATA%\citron\keys'
|
||||
- '%APPDATA%\suyu\keys'
|
||||
- '%APPDATA%\Ryujinx\system'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/yuzu/keys
|
||||
- $HOME/Library/Application Support/Ryujinx/system
|
||||
- file: title.keys
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/yuzu/keys
|
||||
- $HOME/.local/share/eden/keys
|
||||
- $HOME/.local/share/citron/keys
|
||||
- $HOME/.local/share/suyu/keys
|
||||
windows:
|
||||
- '%APPDATA%\yuzu\keys'
|
||||
- '%APPDATA%\eden\keys'
|
||||
- '%APPDATA%\citron\keys'
|
||||
- '%APPDATA%\suyu\keys'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/yuzu/keys
|
||||
# 3DS emulators
|
||||
- file: Citra/sysdata/aes_keys.txt
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/azahar/sysdata
|
||||
windows:
|
||||
- '%APPDATA%\Azahar\sysdata'
|
||||
- file: Citra/sysdata/boot9.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/azahar/sysdata
|
||||
windows:
|
||||
- '%APPDATA%\Azahar\sysdata'
|
||||
# DuckStation (PS1)
|
||||
- pattern: 'scph*.bin'
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/duckstation/bios
|
||||
windows:
|
||||
- '%LOCALAPPDATA%\DuckStation\bios'
|
||||
- '%USERPROFILE%\Documents\DuckStation\bios'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/DuckStation/bios
|
||||
# PCSX2 (PS2)
|
||||
- pattern: 'ps2-*.bin'
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.config/PCSX2/bios
|
||||
- $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios
|
||||
windows:
|
||||
- '%USERPROFILE%\Documents\PCSX2\bios'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/PCSX2/bios
|
||||
# RPCS3 (PS3) - needs menu install
|
||||
- note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.'
|
||||
detect:
|
||||
linux:
|
||||
- $HOME/.config/rpcs3
|
||||
windows:
|
||||
- '%APPDATA%\rpcs3'
|
||||
# Dolphin (GameCube)
|
||||
- file: GC/USA/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/USA
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\USA'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/USA
|
||||
- file: GC/EUR/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/EUR
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\EUR'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/EUR
|
||||
- file: GC/JAP/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/JAP
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\JAP'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/JAP
|
||||
- file: dsp_rom.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin
|
||||
- file: dsp_coef.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin
|
||||
# PPSSPP
|
||||
- file: PPSSPP/ppge_atlas.zim
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.config/ppsspp/PSP/SYSTEM
|
||||
windows:
|
||||
- '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM
|
||||
# Flycast (Dreamcast)
|
||||
- file: dc/dc_boot.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/flycast/data
|
||||
- $HOME/.var/app/org.flycast.Flycast/data/flycast
|
||||
windows:
|
||||
- '%APPDATA%\flycast\data'
|
||||
- file: dc/dc_nvmem.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/flycast/data
|
||||
- $HOME/.var/app/org.flycast.Flycast/data/flycast
|
||||
windows:
|
||||
- '%APPDATA%\flycast\data'
|
||||
recalbox:
|
||||
config: recalbox.yml
|
||||
status: active
|
||||
@@ -468,6 +744,144 @@ platforms:
|
||||
method: file_exists
|
||||
file: /usr/bin/recalbox-settings
|
||||
bios_path: /recalbox/share/bios
|
||||
standalone_copies:
|
||||
# Switch emulators (keys)
|
||||
- file: prod.keys
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/yuzu/keys
|
||||
- $HOME/.local/share/eden/keys
|
||||
- $HOME/.local/share/citron/keys
|
||||
- $HOME/.local/share/suyu/keys
|
||||
- $HOME/.config/Ryujinx/system
|
||||
windows:
|
||||
- '%APPDATA%\yuzu\keys'
|
||||
- '%APPDATA%\eden\keys'
|
||||
- '%APPDATA%\citron\keys'
|
||||
- '%APPDATA%\suyu\keys'
|
||||
- '%APPDATA%\Ryujinx\system'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/yuzu/keys
|
||||
- $HOME/Library/Application Support/Ryujinx/system
|
||||
- file: title.keys
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/yuzu/keys
|
||||
- $HOME/.local/share/eden/keys
|
||||
- $HOME/.local/share/citron/keys
|
||||
- $HOME/.local/share/suyu/keys
|
||||
windows:
|
||||
- '%APPDATA%\yuzu\keys'
|
||||
- '%APPDATA%\eden\keys'
|
||||
- '%APPDATA%\citron\keys'
|
||||
- '%APPDATA%\suyu\keys'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/yuzu/keys
|
||||
# 3DS emulators
|
||||
- file: Citra/sysdata/aes_keys.txt
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/azahar/sysdata
|
||||
windows:
|
||||
- '%APPDATA%\Azahar\sysdata'
|
||||
- file: Citra/sysdata/boot9.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/azahar/sysdata
|
||||
windows:
|
||||
- '%APPDATA%\Azahar\sysdata'
|
||||
# DuckStation (PS1)
|
||||
- pattern: 'scph*.bin'
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/duckstation/bios
|
||||
windows:
|
||||
- '%LOCALAPPDATA%\DuckStation\bios'
|
||||
- '%USERPROFILE%\Documents\DuckStation\bios'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/DuckStation/bios
|
||||
# PCSX2 (PS2)
|
||||
- pattern: 'ps2-*.bin'
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.config/PCSX2/bios
|
||||
- $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios
|
||||
windows:
|
||||
- '%USERPROFILE%\Documents\PCSX2\bios'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/PCSX2/bios
|
||||
# RPCS3 (PS3) - needs menu install
|
||||
- note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.'
|
||||
detect:
|
||||
linux:
|
||||
- $HOME/.config/rpcs3
|
||||
windows:
|
||||
- '%APPDATA%\rpcs3'
|
||||
# Dolphin (GameCube)
|
||||
- file: GC/USA/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/USA
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\USA'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/USA
|
||||
- file: GC/EUR/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/EUR
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\EUR'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/EUR
|
||||
- file: GC/JAP/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/JAP
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\JAP'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/JAP
|
||||
- file: dsp_rom.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin
|
||||
- file: dsp_coef.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin
|
||||
# PPSSPP
|
||||
- file: PPSSPP/ppge_atlas.zim
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.config/ppsspp/PSP/SYSTEM
|
||||
windows:
|
||||
- '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM
|
||||
# Flycast (Dreamcast)
|
||||
- file: dc/dc_boot.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/flycast/data
|
||||
- $HOME/.var/app/org.flycast.Flycast/data/flycast
|
||||
windows:
|
||||
- '%APPDATA%\flycast\data'
|
||||
- file: dc/dc_nvmem.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/flycast/data
|
||||
- $HOME/.var/app/org.flycast.Flycast/data/flycast
|
||||
windows:
|
||||
- '%APPDATA%\flycast\data'
|
||||
retrobat:
|
||||
config: retrobat.yml
|
||||
status: active
|
||||
@@ -653,6 +1067,144 @@ platforms:
|
||||
- os: windows
|
||||
method: path_exists
|
||||
path: '%USERPROFILE%\RetroBat\bios'
|
||||
standalone_copies:
|
||||
# Switch emulators (keys)
|
||||
- file: prod.keys
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/yuzu/keys
|
||||
- $HOME/.local/share/eden/keys
|
||||
- $HOME/.local/share/citron/keys
|
||||
- $HOME/.local/share/suyu/keys
|
||||
- $HOME/.config/Ryujinx/system
|
||||
windows:
|
||||
- '%APPDATA%\yuzu\keys'
|
||||
- '%APPDATA%\eden\keys'
|
||||
- '%APPDATA%\citron\keys'
|
||||
- '%APPDATA%\suyu\keys'
|
||||
- '%APPDATA%\Ryujinx\system'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/yuzu/keys
|
||||
- $HOME/Library/Application Support/Ryujinx/system
|
||||
- file: title.keys
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/yuzu/keys
|
||||
- $HOME/.local/share/eden/keys
|
||||
- $HOME/.local/share/citron/keys
|
||||
- $HOME/.local/share/suyu/keys
|
||||
windows:
|
||||
- '%APPDATA%\yuzu\keys'
|
||||
- '%APPDATA%\eden\keys'
|
||||
- '%APPDATA%\citron\keys'
|
||||
- '%APPDATA%\suyu\keys'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/yuzu/keys
|
||||
# 3DS emulators
|
||||
- file: Citra/sysdata/aes_keys.txt
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/azahar/sysdata
|
||||
windows:
|
||||
- '%APPDATA%\Azahar\sysdata'
|
||||
- file: Citra/sysdata/boot9.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/azahar/sysdata
|
||||
windows:
|
||||
- '%APPDATA%\Azahar\sysdata'
|
||||
# DuckStation (PS1)
|
||||
- pattern: 'scph*.bin'
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/duckstation/bios
|
||||
windows:
|
||||
- '%LOCALAPPDATA%\DuckStation\bios'
|
||||
- '%USERPROFILE%\Documents\DuckStation\bios'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/DuckStation/bios
|
||||
# PCSX2 (PS2)
|
||||
- pattern: 'ps2-*.bin'
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.config/PCSX2/bios
|
||||
- $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios
|
||||
windows:
|
||||
- '%USERPROFILE%\Documents\PCSX2\bios'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/PCSX2/bios
|
||||
# RPCS3 (PS3) - needs menu install
|
||||
- note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.'
|
||||
detect:
|
||||
linux:
|
||||
- $HOME/.config/rpcs3
|
||||
windows:
|
||||
- '%APPDATA%\rpcs3'
|
||||
# Dolphin (GameCube)
|
||||
- file: GC/USA/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/USA
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\USA'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/USA
|
||||
- file: GC/EUR/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/EUR
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\EUR'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/EUR
|
||||
- file: GC/JAP/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/JAP
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\JAP'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/JAP
|
||||
- file: dsp_rom.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin
|
||||
- file: dsp_coef.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin
|
||||
# PPSSPP
|
||||
- file: PPSSPP/ppge_atlas.zim
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.config/ppsspp/PSP/SYSTEM
|
||||
windows:
|
||||
- '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM
|
||||
# Flycast (Dreamcast)
|
||||
- file: dc/dc_boot.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/flycast/data
|
||||
- $HOME/.var/app/org.flycast.Flycast/data/flycast
|
||||
windows:
|
||||
- '%APPDATA%\flycast\data'
|
||||
- file: dc/dc_nvmem.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/flycast/data
|
||||
- $HOME/.var/app/org.flycast.Flycast/data/flycast
|
||||
windows:
|
||||
- '%APPDATA%\flycast\data'
|
||||
emudeck:
|
||||
config: emudeck.yml
|
||||
status: active
|
||||
@@ -681,19 +1233,143 @@ platforms:
|
||||
parse_key: $emulationPath
|
||||
bios_subdir: bios
|
||||
standalone_copies:
|
||||
# Switch emulators (keys)
|
||||
- file: prod.keys
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/yuzu/keys
|
||||
- $HOME/.local/share/eden/keys
|
||||
- $HOME/.local/share/citron/keys
|
||||
- $HOME/.local/share/suyu/keys
|
||||
- $HOME/.config/Ryujinx/system
|
||||
windows:
|
||||
- '%APPDATA%\yuzu\keys'
|
||||
- '%APPDATA%\eden\keys'
|
||||
- file: aes_keys.txt
|
||||
- '%APPDATA%\citron\keys'
|
||||
- '%APPDATA%\suyu\keys'
|
||||
- '%APPDATA%\Ryujinx\system'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/yuzu/keys
|
||||
- $HOME/Library/Application Support/Ryujinx/system
|
||||
- file: title.keys
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/Emulation/bios/citra/keys
|
||||
- $HOME/.local/share/yuzu/keys
|
||||
- $HOME/.local/share/eden/keys
|
||||
- $HOME/.local/share/citron/keys
|
||||
- $HOME/.local/share/suyu/keys
|
||||
windows:
|
||||
- '%APPDATA%\yuzu\keys'
|
||||
- '%APPDATA%\eden\keys'
|
||||
- '%APPDATA%\citron\keys'
|
||||
- '%APPDATA%\suyu\keys'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/yuzu/keys
|
||||
# 3DS emulators
|
||||
- file: Citra/sysdata/aes_keys.txt
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/azahar/sysdata
|
||||
windows:
|
||||
- '%APPDATA%\Azahar\sysdata'
|
||||
- file: Citra/sysdata/boot9.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/azahar/sysdata
|
||||
windows:
|
||||
- '%APPDATA%\Azahar\sysdata'
|
||||
# DuckStation (PS1)
|
||||
- pattern: 'scph*.bin'
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/duckstation/bios
|
||||
windows:
|
||||
- '%LOCALAPPDATA%\DuckStation\bios'
|
||||
- '%USERPROFILE%\Documents\DuckStation\bios'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/DuckStation/bios
|
||||
# PCSX2 (PS2)
|
||||
- pattern: 'ps2-*.bin'
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.config/PCSX2/bios
|
||||
- $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios
|
||||
windows:
|
||||
- '%USERPROFILE%\Documents\PCSX2\bios'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/PCSX2/bios
|
||||
# RPCS3 (PS3) - needs menu install
|
||||
- note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.'
|
||||
detect:
|
||||
linux:
|
||||
- $HOME/.config/rpcs3
|
||||
windows:
|
||||
- '%APPDATA%\rpcs3'
|
||||
# Dolphin (GameCube)
|
||||
- file: GC/USA/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/USA
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\USA'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/USA
|
||||
- file: GC/EUR/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/EUR
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\EUR'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/EUR
|
||||
- file: GC/JAP/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/JAP
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\JAP'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/JAP
|
||||
- file: dsp_rom.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin
|
||||
- file: dsp_coef.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin
|
||||
# PPSSPP
|
||||
- file: PPSSPP/ppge_atlas.zim
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.config/ppsspp/PSP/SYSTEM
|
||||
windows:
|
||||
- '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM
|
||||
# Flycast (Dreamcast)
|
||||
- file: dc/dc_boot.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/flycast/data
|
||||
- $HOME/.var/app/org.flycast.Flycast/data/flycast
|
||||
windows:
|
||||
- '%APPDATA%\flycast\data'
|
||||
- file: dc/dc_nvmem.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/flycast/data
|
||||
- $HOME/.var/app/org.flycast.Flycast/data/flycast
|
||||
windows:
|
||||
- '%APPDATA%\flycast\data'
|
||||
lakka:
|
||||
config: lakka.yml
|
||||
status: active
|
||||
@@ -752,7 +1428,145 @@ platforms:
|
||||
- os: linux
|
||||
method: path_exists
|
||||
path: $HOME/.var/app/net.retrodeck.retrodeck
|
||||
bios_path: $HOME/retrodeck/bios
|
||||
bios_path: $HOME/retrodeck
|
||||
standalone_copies:
|
||||
# Switch emulators (keys)
|
||||
- file: prod.keys
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/yuzu/keys
|
||||
- $HOME/.local/share/eden/keys
|
||||
- $HOME/.local/share/citron/keys
|
||||
- $HOME/.local/share/suyu/keys
|
||||
- $HOME/.config/Ryujinx/system
|
||||
windows:
|
||||
- '%APPDATA%\yuzu\keys'
|
||||
- '%APPDATA%\eden\keys'
|
||||
- '%APPDATA%\citron\keys'
|
||||
- '%APPDATA%\suyu\keys'
|
||||
- '%APPDATA%\Ryujinx\system'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/yuzu/keys
|
||||
- $HOME/Library/Application Support/Ryujinx/system
|
||||
- file: title.keys
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/yuzu/keys
|
||||
- $HOME/.local/share/eden/keys
|
||||
- $HOME/.local/share/citron/keys
|
||||
- $HOME/.local/share/suyu/keys
|
||||
windows:
|
||||
- '%APPDATA%\yuzu\keys'
|
||||
- '%APPDATA%\eden\keys'
|
||||
- '%APPDATA%\citron\keys'
|
||||
- '%APPDATA%\suyu\keys'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/yuzu/keys
|
||||
# 3DS emulators
|
||||
- file: Citra/sysdata/aes_keys.txt
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/azahar/sysdata
|
||||
windows:
|
||||
- '%APPDATA%\Azahar\sysdata'
|
||||
- file: Citra/sysdata/boot9.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/azahar/sysdata
|
||||
windows:
|
||||
- '%APPDATA%\Azahar\sysdata'
|
||||
# DuckStation (PS1)
|
||||
- pattern: 'scph*.bin'
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/duckstation/bios
|
||||
windows:
|
||||
- '%LOCALAPPDATA%\DuckStation\bios'
|
||||
- '%USERPROFILE%\Documents\DuckStation\bios'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/DuckStation/bios
|
||||
# PCSX2 (PS2)
|
||||
- pattern: 'ps2-*.bin'
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.config/PCSX2/bios
|
||||
- $HOME/.var/app/net.pcsx2.PCSX2/config/PCSX2/bios
|
||||
windows:
|
||||
- '%USERPROFILE%\Documents\PCSX2\bios'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/PCSX2/bios
|
||||
# RPCS3 (PS3) - needs menu install
|
||||
- note: 'PS3 firmware (PS3UPDAT.PUP) found. Install via RPCS3 > File > Install Firmware.'
|
||||
detect:
|
||||
linux:
|
||||
- $HOME/.config/rpcs3
|
||||
windows:
|
||||
- '%APPDATA%\rpcs3'
|
||||
# Dolphin (GameCube)
|
||||
- file: GC/USA/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/USA
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\USA'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/USA
|
||||
- file: GC/EUR/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/EUR
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\EUR'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/EUR
|
||||
- file: GC/JAP/IPL.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu/GC/JAP
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator\GC\JAP'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin/GC/JAP
|
||||
- file: dsp_rom.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin
|
||||
- file: dsp_coef.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/dolphin-emu
|
||||
windows:
|
||||
- '%APPDATA%\Dolphin Emulator'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/Dolphin
|
||||
# PPSSPP
|
||||
- file: PPSSPP/ppge_atlas.zim
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.config/ppsspp/PSP/SYSTEM
|
||||
windows:
|
||||
- '%USERPROFILE%\Documents\PPSSPP\PSP\SYSTEM'
|
||||
darwin:
|
||||
- $HOME/Library/Application Support/PPSSPP/PSP/SYSTEM
|
||||
# Flycast (Dreamcast)
|
||||
- file: dc/dc_boot.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/flycast/data
|
||||
- $HOME/.var/app/org.flycast.Flycast/data/flycast
|
||||
windows:
|
||||
- '%APPDATA%\flycast\data'
|
||||
- file: dc/dc_nvmem.bin
|
||||
targets:
|
||||
linux:
|
||||
- $HOME/.local/share/flycast/data
|
||||
- $HOME/.var/app/org.flycast.Flycast/data/flycast
|
||||
windows:
|
||||
- '%APPDATA%\flycast\data'
|
||||
romm:
|
||||
config: romm.yml
|
||||
status: active
|
||||
|
||||
@@ -743,15 +743,13 @@ def group_identical_platforms(
|
||||
inherits[platform] = False
|
||||
continue
|
||||
|
||||
base_dest = config.get("base_destination", "")
|
||||
entries = []
|
||||
for sys_id, system in sorted(config.get("systems", {}).items()):
|
||||
for fe in system.get("files", []):
|
||||
dest = fe.get("destination", fe.get("name", ""))
|
||||
full_dest = f"{base_dest}/{dest}" if base_dest else dest
|
||||
sha1 = fe.get("sha1", "")
|
||||
md5 = fe.get("md5", "")
|
||||
entries.append(f"{full_dest}|{sha1}|{md5}")
|
||||
entries.append(f"{dest}|{sha1}|{md5}")
|
||||
|
||||
fp = hashlib.sha1("|".join(sorted(entries)).encode()).hexdigest()
|
||||
if target_cores_cache:
|
||||
|
||||
@@ -140,6 +140,20 @@ def _resolve_source(
|
||||
return None
|
||||
|
||||
|
||||
def _resolve_archive_source(
|
||||
archive_name: str,
|
||||
by_name: dict[str, list],
|
||||
by_name_lower: dict[str, str],
|
||||
data_names: set[str] | None = None,
|
||||
by_path_suffix: dict | None = None,
|
||||
) -> str:
|
||||
"""Resolve source for an archive (ZIP) name, returning a source category string."""
|
||||
result = _resolve_source(
|
||||
archive_name, by_name, by_name_lower, data_names, by_path_suffix,
|
||||
)
|
||||
return result if result is not None else "missing"
|
||||
|
||||
|
||||
def cross_reference(
|
||||
profiles: dict[str, dict],
|
||||
declared: dict[str, set[str]],
|
||||
@@ -175,6 +189,10 @@ def cross_reference(
|
||||
emu_files = profile.get("files", [])
|
||||
systems = profile.get("systems", [])
|
||||
|
||||
# Skip filename-agnostic profiles (BIOS detected without fixed names)
|
||||
if profile.get("bios_mode") == "agnostic":
|
||||
continue
|
||||
|
||||
if all_declared is not None:
|
||||
platform_names = all_declared
|
||||
else:
|
||||
@@ -184,13 +202,28 @@ def cross_reference(
|
||||
|
||||
gaps = []
|
||||
covered = []
|
||||
unsourceable_list: list[dict] = []
|
||||
archive_gaps: dict[str, dict] = {}
|
||||
seen_files: set[str] = set()
|
||||
for f in emu_files:
|
||||
fname = f.get("name", "")
|
||||
if not fname:
|
||||
if not fname or fname in seen_files:
|
||||
continue
|
||||
|
||||
# Collect unsourceable files separately (documented, not a gap)
|
||||
unsourceable_reason = f.get("unsourceable", "")
|
||||
if unsourceable_reason:
|
||||
seen_files.add(fname)
|
||||
unsourceable_list.append({
|
||||
"name": fname,
|
||||
"required": f.get("required", False),
|
||||
"reason": unsourceable_reason,
|
||||
"source_ref": f.get("source_ref", ""),
|
||||
})
|
||||
continue
|
||||
|
||||
# Skip pattern placeholders (e.g., <bios>.bin, <user-selected>.bin)
|
||||
if "<" in fname or ">" in fname:
|
||||
if "<" in fname or ">" in fname or "*" in fname:
|
||||
continue
|
||||
|
||||
# Skip UI-imported files with explicit path: null (not resolvable by pack)
|
||||
@@ -202,6 +235,61 @@ def cross_reference(
|
||||
if file_mode == "standalone":
|
||||
continue
|
||||
|
||||
# Skip files loaded from non-system directories (save_dir, content_dir)
|
||||
load_from = f.get("load_from", "")
|
||||
if load_from and load_from != "system_dir":
|
||||
continue
|
||||
|
||||
# Skip filename-agnostic files (handled by agnostic scan)
|
||||
if f.get("agnostic"):
|
||||
continue
|
||||
|
||||
archive = f.get("archive")
|
||||
|
||||
# Check platform declaration (by name or archive)
|
||||
in_platform = fname in platform_names
|
||||
if not in_platform and archive:
|
||||
in_platform = archive in platform_names
|
||||
|
||||
if in_platform:
|
||||
seen_files.add(fname)
|
||||
covered.append({
|
||||
"name": fname,
|
||||
"required": f.get("required", False),
|
||||
"in_platform": True,
|
||||
})
|
||||
continue
|
||||
|
||||
seen_files.add(fname)
|
||||
|
||||
# Group archived files by archive name
|
||||
if archive:
|
||||
if archive not in archive_gaps:
|
||||
source = _resolve_archive_source(
|
||||
archive, by_name, by_name_lower, data_names,
|
||||
by_path_suffix,
|
||||
)
|
||||
archive_gaps[archive] = {
|
||||
"name": archive,
|
||||
"required": False,
|
||||
"note": "",
|
||||
"source_ref": "",
|
||||
"in_platform": False,
|
||||
"in_repo": source != "missing",
|
||||
"source": source,
|
||||
"archive": archive,
|
||||
"archive_file_count": 0,
|
||||
"archive_required_count": 0,
|
||||
}
|
||||
entry = archive_gaps[archive]
|
||||
entry["archive_file_count"] += 1
|
||||
if f.get("required", False):
|
||||
entry["archive_required_count"] += 1
|
||||
entry["required"] = True
|
||||
if not entry["source_ref"] and f.get("source_ref"):
|
||||
entry["source_ref"] = f["source_ref"]
|
||||
continue
|
||||
|
||||
# --- resolve source provenance ---
|
||||
storage = f.get("storage", "")
|
||||
if storage in ("release", "large_file"):
|
||||
@@ -235,22 +323,21 @@ def cross_reference(
|
||||
source = "missing"
|
||||
|
||||
in_repo = source != "missing"
|
||||
in_platform = fname in platform_names
|
||||
|
||||
entry = {
|
||||
"name": fname,
|
||||
"required": f.get("required", False),
|
||||
"note": f.get("note", ""),
|
||||
"source_ref": f.get("source_ref", ""),
|
||||
"in_platform": in_platform,
|
||||
"in_platform": False,
|
||||
"in_repo": in_repo,
|
||||
"source": source,
|
||||
}
|
||||
gaps.append(entry)
|
||||
|
||||
if not in_platform:
|
||||
gaps.append(entry)
|
||||
else:
|
||||
covered.append(entry)
|
||||
# Append grouped archive gaps
|
||||
for ag in sorted(archive_gaps.values(), key=lambda e: e["name"]):
|
||||
gaps.append(ag)
|
||||
|
||||
report[emu_name] = {
|
||||
"emulator": profile.get("emulator", emu_name),
|
||||
@@ -264,6 +351,7 @@ def cross_reference(
|
||||
"gap_data": sum(1 for g in gaps if g["source"] == "data"),
|
||||
"gap_large_file": sum(1 for g in gaps if g["source"] == "large_file"),
|
||||
"gap_details": gaps,
|
||||
"unsourceable": unsourceable_list,
|
||||
}
|
||||
|
||||
return report
|
||||
@@ -301,7 +389,12 @@ def print_report(report: dict) -> None:
|
||||
req = "*" if g["required"] else " "
|
||||
src = g.get("source", "missing").upper()
|
||||
note = f" -- {g['note']}" if g["note"] else ""
|
||||
print(f" {req} {g['name']} [{src}]{note}")
|
||||
archive_info = ""
|
||||
if g.get("archive"):
|
||||
fc = g.get("archive_file_count", 0)
|
||||
rc = g.get("archive_required_count", 0)
|
||||
archive_info = f" ({fc} files, {rc} required)"
|
||||
print(f" {req} {g['name']} [{src}]{archive_info}{note}")
|
||||
|
||||
total_gaps += gaps
|
||||
for key in totals:
|
||||
|
||||
@@ -246,6 +246,13 @@ def _register_path(dest: str, seen_files: set[str], seen_parents: set[str]) -> N
|
||||
seen_parents.add(parent)
|
||||
|
||||
|
||||
def _flat(arcname: str, prefix: str, flatten: bool) -> str:
|
||||
"""Strip base_destination prefix from ZIP arcname when flattening."""
|
||||
if flatten and prefix and arcname.startswith(prefix + "/"):
|
||||
return arcname[len(prefix) + 1:]
|
||||
return arcname
|
||||
|
||||
|
||||
def resolve_file(
|
||||
file_entry: dict,
|
||||
db: dict,
|
||||
@@ -783,15 +790,14 @@ def _build_readme(
|
||||
" 1. Find your RetroArch system directory:\n"
|
||||
" - RetroArch > Settings > Directory > System/BIOS\n"
|
||||
" - Default: retroarch/system/\n"
|
||||
' 2. Open the "system" folder from this archive\n'
|
||||
" 3. Copy ALL contents into your system directory\n"
|
||||
" 4. Overwrite if asked\n\n"
|
||||
" 2. Extract all files from this archive directly into your system directory\n"
|
||||
" 3. Overwrite if asked\n\n"
|
||||
" Option C: Manual (handheld / SD card)\n"
|
||||
" -------------------------------------\n"
|
||||
" Anbernic, Retroid, Miyoo, Trimui, etc.:\n"
|
||||
" 1. Connect your SD card to your PC\n"
|
||||
" 2. Find the BIOS folder (usually BIOS/ or system/)\n"
|
||||
' 3. Copy ALL contents of "system" from this archive\n'
|
||||
" 3. Extract all files from this archive directly into that folder\n"
|
||||
" 4. Eject SD card and reboot your device\n\n"
|
||||
" Common paths by device:\n"
|
||||
" Anbernic (ArkOS/JELOS): BIOS/\n"
|
||||
@@ -810,14 +816,13 @@ def _build_readme(
|
||||
" 1. On your PC, open the Batocera network share:\n"
|
||||
" - Windows: \\\\BATOCERA\\share\\bios\\\n"
|
||||
" - Mac/Linux: smb://batocera/share/bios/\n"
|
||||
' 2. Open the "bios" folder from this archive\n'
|
||||
" 3. Copy ALL contents into the share\n"
|
||||
" 4. Overwrite if asked\n\n"
|
||||
" 2. Extract all files from this archive directly into the share\n"
|
||||
" 3. Overwrite if asked\n\n"
|
||||
" Option C: Manual (SD card)\n"
|
||||
" --------------------------\n"
|
||||
" 1. Put the SD card in your PC\n"
|
||||
" 2. Navigate to /userdata/bios/ on the SHARE partition\n"
|
||||
' 3. Copy ALL contents of "bios" from this archive\n\n'
|
||||
" 3. Extract all files from this archive directly into that folder\n\n"
|
||||
" NOTE: Dreamcast flash memory is named dc_nvmem.bin\n"
|
||||
" (if your setup asks for dc_flash.bin, same file).\n\n"
|
||||
),
|
||||
@@ -831,13 +836,12 @@ def _build_readme(
|
||||
" 1. On your PC, open the Recalbox network share:\n"
|
||||
" - Windows: \\\\RECALBOX\\share\\bios\\\n"
|
||||
" - Mac/Linux: smb://recalbox/share/bios/\n"
|
||||
' 2. Open the "bios" folder from this archive\n'
|
||||
" 3. Copy ALL contents into the share\n\n"
|
||||
" 2. Extract all files from this archive directly into the share\n\n"
|
||||
" Option C: Manual (SD card)\n"
|
||||
" --------------------------\n"
|
||||
" 1. Put the SD card in your PC\n"
|
||||
" 2. Navigate to /recalbox/share/bios/\n"
|
||||
' 3. Copy ALL contents of "bios" from this archive\n\n'
|
||||
" 3. Extract all files from this archive directly into that folder\n\n"
|
||||
),
|
||||
"emudeck": (
|
||||
"INSTALLATION GUIDE (Steam Deck / Linux)\n\n"
|
||||
@@ -851,8 +855,7 @@ def _build_readme(
|
||||
" ----------------\n"
|
||||
" 1. Open Dolphin file manager\n"
|
||||
" 2. Navigate to ~/Emulation/bios/\n"
|
||||
' 3. Open the "bios" folder from this archive\n'
|
||||
" 4. Copy ALL contents into ~/Emulation/bios/\n\n"
|
||||
" 3. Extract all files from this archive directly into ~/Emulation/bios/\n\n"
|
||||
" STANDALONE EMULATORS (extra step)\n"
|
||||
" Switch and 3DS emulators need keys in specific folders:\n"
|
||||
" prod.keys -> ~/.local/share/yuzu/keys/\n"
|
||||
@@ -871,11 +874,8 @@ def _build_readme(
|
||||
" ----------------\n"
|
||||
" 1. Open Dolphin file manager\n"
|
||||
" 2. Show hidden files (Ctrl+H)\n"
|
||||
" 3. Navigate to ~/retrodeck/\n"
|
||||
' 4. Open the "bios" folder from this archive\n'
|
||||
" 5. Copy ALL contents into ~/retrodeck/bios/\n"
|
||||
' 6. If the archive contains a "roms" folder, copy\n'
|
||||
" its contents into ~/retrodeck/roms/\n\n"
|
||||
" 3. Navigate to ~/retrodeck/bios/\n"
|
||||
" 4. Extract all files from this archive directly into ~/retrodeck/bios/\n\n"
|
||||
" NOTE: RetroDECK uses its own BIOS checker. After\n"
|
||||
" copying, open RetroDECK > Tools > BIOS Checker to\n"
|
||||
" verify everything is detected.\n\n"
|
||||
@@ -891,9 +891,8 @@ def _build_readme(
|
||||
" 1. Open your RetroBat installation folder\n"
|
||||
" 2. Navigate to the bios\\ subfolder\n"
|
||||
" (default: C:\\RetroBat\\bios\\)\n"
|
||||
' 3. Open the "bios" folder from this archive\n'
|
||||
" 4. Copy ALL contents into your bios\\ folder\n"
|
||||
" 5. Overwrite if asked\n\n"
|
||||
" 3. Extract all files from this archive directly into your bios\\ folder\n"
|
||||
" 4. Overwrite if asked\n\n"
|
||||
),
|
||||
"bizhawk": (
|
||||
"INSTALLATION GUIDE\n\n"
|
||||
@@ -901,16 +900,15 @@ def _build_readme(
|
||||
" 2. Navigate to the Firmware subfolder:\n"
|
||||
" - Windows: BizHawk\\Firmware\\\n"
|
||||
" - Linux: ~/.config/BizHawk/Firmware/\n"
|
||||
' 3. Open the "Firmware" folder from this archive\n'
|
||||
" 4. Copy ALL contents into your Firmware folder\n"
|
||||
" 5. In BizHawk: Config > Paths > Firmware should\n"
|
||||
" 3. Extract all files from this archive directly into your Firmware folder\n"
|
||||
" 4. In BizHawk: Config > Paths > Firmware should\n"
|
||||
" point to this folder\n\n"
|
||||
),
|
||||
"romm": (
|
||||
"INSTALLATION GUIDE (RomM server)\n\n"
|
||||
" 1. Locate your RomM library folder\n"
|
||||
" 2. Navigate to the bios/ subdirectory\n"
|
||||
' 3. Copy ALL contents of "bios" from this archive\n'
|
||||
" 3. Extract all files from this archive directly into that folder\n"
|
||||
" 4. Restart the RomM service to detect new files\n\n"
|
||||
),
|
||||
"retropie": (
|
||||
@@ -918,7 +916,7 @@ def _build_readme(
|
||||
" Option A: Via network share\n"
|
||||
" --------------------------\n"
|
||||
" 1. On your PC, open: \\\\RETROPIE\\bios\\\n"
|
||||
' 2. Copy ALL contents of "BIOS" from this archive\n\n'
|
||||
" 2. Extract all files from this archive directly into that folder\n\n"
|
||||
" Option B: Via SSH\n"
|
||||
" -----------------\n"
|
||||
" 1. SSH into your Pi: ssh pi@retropie\n"
|
||||
@@ -927,7 +925,7 @@ def _build_readme(
|
||||
" ---------------------\n"
|
||||
" 1. Put the SD card in your PC\n"
|
||||
" 2. Navigate to /home/pi/RetroPie/BIOS/\n"
|
||||
' 3. Copy ALL contents of "BIOS" from this archive\n\n'
|
||||
" 3. Extract all files from this archive directly into that folder\n\n"
|
||||
),
|
||||
}
|
||||
|
||||
@@ -938,9 +936,8 @@ def _build_readme(
|
||||
platform_name,
|
||||
(
|
||||
f"INSTALLATION\n\n"
|
||||
f' 1. Open the "{base_dest or "files"}" folder in this archive\n'
|
||||
f" 2. Copy ALL contents to your BIOS directory\n"
|
||||
f" 3. Overwrite if asked\n\n"
|
||||
f" 1. Extract all files from this archive directly into your BIOS directory\n"
|
||||
f" 2. Overwrite if asked\n\n"
|
||||
),
|
||||
)
|
||||
|
||||
@@ -977,10 +974,7 @@ def _build_readme(
|
||||
credits = "\nCONTRIBUTORS\n\n"
|
||||
for cb in contributors:
|
||||
username = cb.get("username", "")
|
||||
contribution = cb.get("contribution", "")
|
||||
pr = cb.get("pr")
|
||||
pr_ref = f" (#{pr})" if pr else ""
|
||||
credits += f" @{username} - {contribution}{pr_ref}\n"
|
||||
credits += f" @{username}\n"
|
||||
credits += "\n"
|
||||
|
||||
return header + source_info + guide + credits + footer
|
||||
@@ -1022,6 +1016,7 @@ def generate_pack(
|
||||
system_filter: list[str] | None = None,
|
||||
precomputed_extras: list[dict] | None = None,
|
||||
source: str = "full",
|
||||
flatten: bool = True,
|
||||
) -> str | None:
|
||||
"""Generate a ZIP pack for a platform.
|
||||
|
||||
@@ -1157,7 +1152,7 @@ def generate_pack(
|
||||
f"{base_dest}/{instr_name}" if base_dest else instr_name
|
||||
)
|
||||
zf.writestr(
|
||||
instr_path,
|
||||
_flat(instr_path, base_dest, flatten),
|
||||
f"File needed: {file_entry['name']}\n\n{instructions}\n",
|
||||
)
|
||||
user_provided.append(file_entry["name"])
|
||||
@@ -1183,9 +1178,9 @@ def generate_pack(
|
||||
if download_external(file_entry, tmp_path):
|
||||
extract = file_entry.get("extract", False)
|
||||
if extract and tmp_path.endswith(".zip"):
|
||||
_extract_zip_to_archive(tmp_path, full_dest, zf)
|
||||
_extract_zip_to_archive(tmp_path, _flat(full_dest, base_dest, flatten), zf)
|
||||
else:
|
||||
zf.write(tmp_path, full_dest)
|
||||
zf.write(tmp_path, _flat(full_dest, base_dest, flatten))
|
||||
seen_destinations.add(dedup_key)
|
||||
_register_path(dedup_key, seen_destinations, seen_parents)
|
||||
if case_insensitive:
|
||||
@@ -1263,7 +1258,7 @@ def generate_pack(
|
||||
else readme_name
|
||||
)
|
||||
if readme_full not in seen_destinations:
|
||||
zf.writestr(readme_full, readme_text)
|
||||
zf.writestr(_flat(readme_full, base_dest, flatten), readme_text)
|
||||
seen_destinations.add(readme_full)
|
||||
status = "agnostic_fallback"
|
||||
# Fall through to normal packing below
|
||||
@@ -1349,12 +1344,13 @@ def generate_pack(
|
||||
seen_lower.add(dedup_key.lower())
|
||||
|
||||
extract = file_entry.get("extract", False)
|
||||
flat_dest = _flat(full_dest, base_dest, flatten)
|
||||
if extract and local_path.endswith(".zip"):
|
||||
_extract_zip_to_archive(local_path, full_dest, zf)
|
||||
_extract_zip_to_archive(local_path, flat_dest, zf)
|
||||
elif local_path.endswith(".zip"):
|
||||
_normalize_zip_for_pack(local_path, full_dest, zf)
|
||||
_normalize_zip_for_pack(local_path, flat_dest, zf)
|
||||
else:
|
||||
zf.write(local_path, full_dest)
|
||||
zf.write(local_path, flat_dest)
|
||||
total_files += 1
|
||||
|
||||
# Core requirements: files platform's cores need but YAML doesn't declare
|
||||
@@ -1440,10 +1436,11 @@ def generate_pack(
|
||||
if status in ("not_found", "external", "user_provided"):
|
||||
continue
|
||||
|
||||
flat_dest = _flat(full_dest, base_dest, flatten)
|
||||
if local_path.endswith(".zip"):
|
||||
_normalize_zip_for_pack(local_path, full_dest, zf)
|
||||
_normalize_zip_for_pack(local_path, flat_dest, zf)
|
||||
else:
|
||||
zf.write(local_path, full_dest)
|
||||
zf.write(local_path, flat_dest)
|
||||
seen_destinations.add(full_dest)
|
||||
_register_path(full_dest, seen_destinations, seen_parents)
|
||||
if case_insensitive:
|
||||
@@ -1489,7 +1486,7 @@ def generate_pack(
|
||||
_register_path(full, seen_destinations, seen_parents)
|
||||
if case_insensitive:
|
||||
seen_lower.add(full.lower())
|
||||
zf.write(src, full)
|
||||
zf.write(src, _flat(full, base_dest, flatten))
|
||||
total_files += 1
|
||||
|
||||
# README.txt for users -personalized step-by-step per platform
|
||||
@@ -2432,6 +2429,11 @@ def _run_verify_packs(args):
|
||||
with zipfile.ZipFile(zip_path) as zf:
|
||||
zf.extractall(extract_dir)
|
||||
|
||||
# Auto-detect flat vs nested extraction
|
||||
is_flat = bool(base_dest) and not os.path.isdir(
|
||||
os.path.join(extract_dir, base_dest)
|
||||
)
|
||||
|
||||
missing = []
|
||||
hash_fail = []
|
||||
ok = 0
|
||||
@@ -2442,7 +2444,7 @@ def _run_verify_packs(args):
|
||||
continue
|
||||
fp = (
|
||||
os.path.join(extract_dir, base_dest, dest)
|
||||
if base_dest
|
||||
if base_dest and not is_flat
|
||||
else os.path.join(extract_dir, dest)
|
||||
)
|
||||
# Case-insensitive fallback
|
||||
@@ -2613,9 +2615,11 @@ def _run_platform_packs(
|
||||
load_platform_config(p, args.platforms_dir).get("platform", p)
|
||||
for p in group_platforms
|
||||
]
|
||||
source_tag = {"platform": "_Platform", "truth": "_Truth"}.get(source, "")
|
||||
req_tag = "_Required" if required_only else ""
|
||||
combined = (
|
||||
"_".join(n.replace(" ", "") for n in all_names)
|
||||
+ f"{ver_tag}_BIOS_Pack.zip"
|
||||
+ f"{ver_tag}{source_tag}{req_tag}_BIOS_Pack.zip"
|
||||
)
|
||||
new_path = os.path.join(os.path.dirname(zip_path), combined)
|
||||
if new_path != zip_path:
|
||||
@@ -3275,7 +3279,11 @@ def verify_pack(
|
||||
# Data directory: check against cached files
|
||||
if status == "untracked" and _data_index:
|
||||
_bn = os.path.basename(name)
|
||||
_pr = name[len("system/") :] if name.startswith("system/") else name
|
||||
_pr = name
|
||||
for _known_prefix in ("system/", "bios/", "BIOS/", "Firmware/"):
|
||||
if name.startswith(_known_prefix):
|
||||
_pr = name[len(_known_prefix):]
|
||||
break
|
||||
_cands = []
|
||||
if _pr in _data_path_index:
|
||||
_cands.append(_data_path_index[_pr])
|
||||
@@ -3442,6 +3450,13 @@ def verify_pack_against_platform(
|
||||
zip_set = set(zf.namelist())
|
||||
zip_lower = {n.lower(): n for n in zip_set}
|
||||
|
||||
# Auto-detect flat vs nested ZIP
|
||||
is_flat = bool(base_dest) and not any(
|
||||
n.startswith(base_dest + "/")
|
||||
for n in zip_set
|
||||
if n not in ("README.txt", "manifest.json") and not n.endswith("/")
|
||||
)
|
||||
|
||||
# Structural checks
|
||||
dupes = sum(1 for c in Counter(zf.namelist()).values() if c > 1)
|
||||
if dupes:
|
||||
@@ -3471,7 +3486,7 @@ def verify_pack_against_platform(
|
||||
dest = fe.get("destination", fe.get("name", ""))
|
||||
if not dest:
|
||||
continue
|
||||
expected = f"{base_dest}/{dest}" if base_dest else dest
|
||||
expected = f"{base_dest}/{dest}" if base_dest and not is_flat else dest
|
||||
baseline_checked += 1
|
||||
|
||||
if expected in zip_set or expected.lower() in zip_lower:
|
||||
@@ -3498,7 +3513,7 @@ def verify_pack_against_platform(
|
||||
continue
|
||||
raw_dest = u.get("path") or u["name"]
|
||||
dest = f"{raw_dest}{u['name']}" if raw_dest.endswith("/") else raw_dest
|
||||
if extras_pfx:
|
||||
if extras_pfx and not (is_flat and extras_pfx == base_dest):
|
||||
if not dest.startswith(f"{extras_pfx}/"):
|
||||
full = f"{extras_pfx}/{dest}"
|
||||
else:
|
||||
|
||||
@@ -93,20 +93,6 @@ def fetch_contributors() -> list[dict]:
|
||||
return []
|
||||
|
||||
|
||||
def _build_contributor_map(registry: dict) -> dict[str, list[dict]]:
|
||||
"""Map GitHub username to list of {platform, contribution, pr}."""
|
||||
result: dict[str, list[dict]] = {}
|
||||
for platform_name, entry in registry.items():
|
||||
for c in entry.get("contributed_by", []):
|
||||
username = c["username"]
|
||||
result.setdefault(username, []).append({
|
||||
"platform": platform_name,
|
||||
"contribution": c.get("contribution", ""),
|
||||
"pr": c.get("pr"),
|
||||
})
|
||||
return result
|
||||
|
||||
|
||||
def generate_readme(db: dict, platforms_dir: str) -> str:
|
||||
total_files = db.get("total_files", 0)
|
||||
total_size = db.get("total_size", 0)
|
||||
@@ -115,13 +101,6 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
|
||||
|
||||
platform_names = list_registered_platforms(platforms_dir, include_archived=True)
|
||||
|
||||
registry_path = Path(platforms_dir) / "_registry.yml"
|
||||
registry = {}
|
||||
if registry_path.exists():
|
||||
import yaml
|
||||
with open(registry_path) as f:
|
||||
registry = (yaml.safe_load(f) or {}).get("platforms", {})
|
||||
|
||||
from common import load_data_dir_registry
|
||||
from cross_reference import _build_supplemental_index
|
||||
|
||||
@@ -164,7 +143,9 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
|
||||
pass
|
||||
|
||||
lines = [
|
||||
"# RetroBIOS",
|
||||
'<p align="center">',
|
||||
' <img src=".github/assets/banner.png" alt="RetroBIOS" width="400">',
|
||||
"</p>",
|
||||
"",
|
||||
f"Complete BIOS and firmware packs for "
|
||||
f"{', '.join(c['platform'] for c in sorted(coverages.values(), key=lambda x: x[
|
||||
@@ -353,47 +334,30 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
|
||||
|
||||
contributors = fetch_contributors()
|
||||
if contributors:
|
||||
contributor_map = _build_contributor_map(registry)
|
||||
|
||||
lines.extend(
|
||||
[
|
||||
"## Contributors",
|
||||
"",
|
||||
]
|
||||
)
|
||||
|
||||
platform_display: dict[str, str] = {}
|
||||
for name, cov in coverages.items():
|
||||
platform_display[name] = cov["platform"]
|
||||
|
||||
for c in contributors:
|
||||
login = c["login"]
|
||||
avatar = c.get("avatar_url", "")
|
||||
url = c.get("html_url", f"https://github.com/{login}")
|
||||
|
||||
contributions = contributor_map.get(login, [])
|
||||
if contributions:
|
||||
parts = []
|
||||
for contrib in contributions:
|
||||
display = platform_display.get(contrib["platform"], contrib["platform"])
|
||||
pr = contrib.get("pr")
|
||||
label = display
|
||||
if pr:
|
||||
label += f" [#{pr}](https://github.com/Abdess/retrobios/pull/{pr})"
|
||||
parts.append(label)
|
||||
desc = ", ".join(parts)
|
||||
else:
|
||||
desc = ""
|
||||
|
||||
line = f'<a href="{url}"><img src="{avatar}" width="50" title="{login}"></a>'
|
||||
if desc:
|
||||
line += f" {desc}"
|
||||
lines.append(line)
|
||||
|
||||
lines.append(
|
||||
f'<a href="{url}"><img src="{avatar}" width="50" title="{login}"></a>'
|
||||
)
|
||||
lines.append("")
|
||||
|
||||
lines.extend(
|
||||
[
|
||||
"",
|
||||
"## Community tools",
|
||||
"",
|
||||
"- [BIOS Preservation Tool](https://github.com/monster-penguin/BIOS-Preservation-Tool)"
|
||||
" by [monster-penguin](https://github.com/monster-penguin)"
|
||||
" - scan, verify, and stage your own BIOS collection"
|
||||
" using RetroBIOS hash metadata",
|
||||
"",
|
||||
"## Contributing",
|
||||
"",
|
||||
|
||||
@@ -127,11 +127,22 @@ def _build_system_page_map_from_data(
|
||||
break
|
||||
|
||||
|
||||
def _slugify_anchor(text: str) -> str:
|
||||
"""Slugify text for MkDocs anchor compatibility."""
|
||||
import re
|
||||
|
||||
slug = text.lower()
|
||||
slug = re.sub(r"[^\w\s-]", "", slug)
|
||||
slug = re.sub(r"[\s]+", "-", slug)
|
||||
slug = slug.strip("-")
|
||||
return slug
|
||||
|
||||
|
||||
def _system_link(sys_id: str, prefix: str = "") -> str:
|
||||
"""Generate a markdown link to a system page with anchor."""
|
||||
if sys_id in _system_page_map:
|
||||
slug, console = _system_page_map[sys_id]
|
||||
anchor = console.lower().replace(" ", "-").replace("/", "-")
|
||||
anchor = _slugify_anchor(console)
|
||||
return f"[{sys_id}]({prefix}systems/{slug}.md#{anchor})"
|
||||
return sys_id
|
||||
|
||||
@@ -239,7 +250,9 @@ def generate_home(
|
||||
# Classification stats
|
||||
classifications: dict[str, int] = {}
|
||||
for p in unique.values():
|
||||
cls = p.get("core_classification", "unclassified")
|
||||
cls = p.get("core_classification", "other")
|
||||
if cls not in CLS_LABELS or cls == "unclassified":
|
||||
cls = "other"
|
||||
classifications[cls] = classifications.get(cls, 0) + 1
|
||||
|
||||
# Count total systems across all profiles
|
||||
@@ -318,10 +331,13 @@ def generate_home(
|
||||
" |----------|-----------|",
|
||||
" | RetroArch / Lakka | `system/` |",
|
||||
" | Batocera | `/userdata/bios/` |",
|
||||
" | BizHawk | `Firmware/` |",
|
||||
" | EmuDeck | `Emulation/bios/` |",
|
||||
" | Recalbox | `/recalbox/share/bios/` |",
|
||||
" | RetroBat | `bios/` |",
|
||||
" | RetroDECK | `~/retrodeck/bios/` |",
|
||||
" | EmuDeck | `Emulation/bios/` |",
|
||||
" | RetroPie | `~/RetroPie/BIOS/` |",
|
||||
" | RomM | `bios/{platform_slug}/` |",
|
||||
"",
|
||||
]
|
||||
)
|
||||
@@ -893,8 +909,10 @@ def generate_emulator_page(
|
||||
emu_name = profile.get("emulator", name)
|
||||
emu_type = profile.get("type", "unknown")
|
||||
classification = profile.get("core_classification", "")
|
||||
source = profile.get("source", "")
|
||||
upstream = profile.get("upstream", "")
|
||||
source_raw = profile.get("source", "")
|
||||
source = str(source_raw) if not isinstance(source_raw, dict) else ""
|
||||
upstream_raw = profile.get("upstream", "")
|
||||
upstream = str(upstream_raw) if not isinstance(upstream_raw, dict) else ""
|
||||
version = profile.get("core_version", "unknown")
|
||||
profile.get("display_name", emu_name)
|
||||
profiled = profile.get("profiled_date", "unknown")
|
||||
@@ -920,10 +938,32 @@ def generate_emulator_page(
|
||||
if classification:
|
||||
cls_display = CLS_LABELS.get(classification, classification)
|
||||
lines.append(f"| Classification | {cls_display} |")
|
||||
if source:
|
||||
lines.append(f"| Source | [{source}]({source}) |")
|
||||
if upstream and upstream != source:
|
||||
lines.append(f"| Upstream | [{upstream}]({upstream}) |")
|
||||
if isinstance(source_raw, dict):
|
||||
parts = []
|
||||
for k, v in source_raw.items():
|
||||
if isinstance(v, str) and v.startswith("http"):
|
||||
parts.append(f"[{k}]({v})")
|
||||
else:
|
||||
parts.append(f"{k}: {v}")
|
||||
lines.append(f"| Source | {', '.join(parts)} |")
|
||||
elif source:
|
||||
if source.startswith("http"):
|
||||
lines.append(f"| Source | [{source}]({source}) |")
|
||||
else:
|
||||
lines.append(f"| Source | {source} |")
|
||||
if isinstance(upstream_raw, dict):
|
||||
parts = []
|
||||
for k, v in upstream_raw.items():
|
||||
if isinstance(v, str) and v.startswith("http"):
|
||||
parts.append(f"[{k}]({v})")
|
||||
else:
|
||||
parts.append(f"{k}: {v}")
|
||||
lines.append(f"| Upstream | {', '.join(parts)} |")
|
||||
elif upstream and upstream != source:
|
||||
if upstream.startswith("http"):
|
||||
lines.append(f"| Upstream | [{upstream}]({upstream}) |")
|
||||
else:
|
||||
lines.append(f"| Upstream | {upstream} |")
|
||||
lines.append(f"| Version | {version} |")
|
||||
lines.append(f"| Profiled | {profiled} |")
|
||||
if cores:
|
||||
@@ -1709,6 +1749,35 @@ def generate_gap_analysis(
|
||||
)
|
||||
lines.append("")
|
||||
|
||||
# ---- Section 4: Acknowledged gaps (unsourceable files) ----
|
||||
|
||||
all_unsourceable: list[dict] = []
|
||||
for emu_name, data in sorted(report.items()):
|
||||
for u in data.get("unsourceable", []):
|
||||
all_unsourceable.append({
|
||||
"name": u["name"],
|
||||
"emulator": data["emulator"],
|
||||
"reason": u["reason"],
|
||||
"source_ref": u.get("source_ref", ""),
|
||||
})
|
||||
|
||||
if all_unsourceable:
|
||||
lines.extend([
|
||||
"## Acknowledged Gaps",
|
||||
"",
|
||||
f"{len(all_unsourceable)} files documented as unsourceable "
|
||||
"(verified from source code).",
|
||||
"",
|
||||
"| File | Emulator | Reason | Source ref |",
|
||||
"|------|----------|--------|-----------|",
|
||||
])
|
||||
for u in sorted(all_unsourceable, key=lambda x: x["name"]):
|
||||
lines.append(
|
||||
f"| `{u['name']}` | {u['emulator']} | {u['reason']} "
|
||||
f"| {u['source_ref']} |"
|
||||
)
|
||||
lines.append("")
|
||||
|
||||
lines.extend(["", f'<div class="rb-timestamp">Generated on {_timestamp()}.</div>'])
|
||||
return "\n".join(lines) + "\n"
|
||||
|
||||
@@ -1795,8 +1864,10 @@ def generate_cross_reference(
|
||||
cls_raw = p.get("core_classification", "-")
|
||||
cls = CLS_LABELS.get(cls_raw, cls_raw)
|
||||
p.get("type", "")
|
||||
upstream = p.get("upstream", "")
|
||||
source = p.get("source", "")
|
||||
upstream_raw2 = p.get("upstream", "")
|
||||
upstream = str(upstream_raw2) if not isinstance(upstream_raw2, dict) else ""
|
||||
source_raw2 = p.get("source", "")
|
||||
source = str(source_raw2) if not isinstance(source_raw2, dict) else ""
|
||||
systems = p.get("systems", [])
|
||||
files = p.get("files", [])
|
||||
|
||||
@@ -1818,12 +1889,16 @@ def generate_cross_reference(
|
||||
file_str += f" ({', '.join(parts)})"
|
||||
|
||||
upstream_display = "-"
|
||||
if upstream:
|
||||
if upstream and upstream.startswith("http"):
|
||||
upstream_short = upstream.replace("https://github.com/", "")
|
||||
upstream_display = f"[{upstream_short}]({upstream})"
|
||||
elif source:
|
||||
elif upstream:
|
||||
upstream_display = upstream
|
||||
elif source and source.startswith("http"):
|
||||
source_short = source.replace("https://github.com/", "")
|
||||
upstream_display = f"[{source_short}]({source})"
|
||||
elif source:
|
||||
upstream_display = source
|
||||
|
||||
lines.append(
|
||||
f" | [{emu_display}](emulators/{emu_name}.md) | {cls} | "
|
||||
@@ -1845,9 +1920,10 @@ def generate_cross_reference(
|
||||
# Group profiles by upstream
|
||||
by_upstream: dict[str, list[str]] = {}
|
||||
for emu_name, p in sorted(unique.items()):
|
||||
upstream = p.get("upstream", p.get("source", ""))
|
||||
if upstream:
|
||||
by_upstream.setdefault(upstream, []).append(emu_name)
|
||||
raw_up = p.get("upstream", p.get("source", ""))
|
||||
up_str = str(raw_up) if not isinstance(raw_up, dict) else ""
|
||||
if up_str:
|
||||
by_upstream.setdefault(up_str, []).append(emu_name)
|
||||
|
||||
# Build platform membership per core
|
||||
platform_membership: dict[str, set[str]] = {}
|
||||
@@ -1881,8 +1957,12 @@ def generate_cross_reference(
|
||||
plat_str = ", ".join(sorted(all_plats)) if all_plats else "-"
|
||||
core_links = ", ".join(f"[{c}](emulators/{c}.md)" for c in sorted(cores))
|
||||
|
||||
if upstream_url.startswith("http"):
|
||||
upstream_cell = f"[{upstream_short}]({upstream_url})"
|
||||
else:
|
||||
upstream_cell = upstream_short
|
||||
lines.append(
|
||||
f"| [{upstream_short}]({upstream_url}) | {core_links} | "
|
||||
f"| {upstream_cell} | {core_links} | "
|
||||
f"{cls_str} | {plat_str} |"
|
||||
)
|
||||
|
||||
@@ -1944,6 +2024,7 @@ def generate_wiki_data_model(db: dict, profiles: dict) -> str:
|
||||
by_name = len(db.get("indexes", {}).get("by_name", {}))
|
||||
by_crc32 = len(db.get("indexes", {}).get("by_crc32", {}))
|
||||
by_path = len(db.get("indexes", {}).get("by_path_suffix", {}))
|
||||
by_sha256 = len(db.get("indexes", {}).get("by_sha256", {}))
|
||||
|
||||
lines = [
|
||||
f"# Data model - {SITE_NAME}",
|
||||
@@ -1975,6 +2056,7 @@ def generate_wiki_data_model(db: dict, profiles: dict) -> str:
|
||||
f"| `by_name` | {by_name} | filename to SHA1 list (name-based resolution) |",
|
||||
f"| `by_crc32` | {by_crc32} | CRC32 to SHA1 lookup |",
|
||||
f"| `by_path_suffix` | {by_path} | relative path to SHA1 (regional variant disambiguation) |",
|
||||
f"| `by_sha256` | {by_sha256} | SHA256 to SHA1 lookup (emulator profile validation) |",
|
||||
"",
|
||||
"### File resolution order",
|
||||
"",
|
||||
@@ -1987,6 +2069,8 @@ def generate_wiki_data_model(db: dict, profiles: dict) -> str:
|
||||
"5. Name + alias with md5_composite / direct MD5 per candidate",
|
||||
"6. zippedFile content match via inner ROM MD5 index",
|
||||
"7. MAME clone fallback (deduped ZIP mapped to canonical name)",
|
||||
"8. Data directory scan (exact path then case-insensitive basename walk)",
|
||||
"9. Agnostic fallback (size-constrained match under system path prefix)",
|
||||
"",
|
||||
"## Platform YAML",
|
||||
"",
|
||||
@@ -2052,6 +2136,131 @@ def _build_emulator_file_index(profiles: dict) -> dict[str, dict]:
|
||||
# mkdocs.yml nav generator
|
||||
|
||||
|
||||
def generate_which_pack() -> str:
|
||||
"""Generate the 'Which pack?' decision page."""
|
||||
rel = "https://github.com/Abdess/retrobios/releases"
|
||||
return f"""\
|
||||
# Getting started
|
||||
|
||||
Some retro consoles need firmware files (commonly called BIOS) to run games.
|
||||
Without them, the emulator either refuses to start the game or runs it with
|
||||
reduced accuracy. This project collects and verifies those files so they are
|
||||
ready to use.
|
||||
|
||||
## Quick install
|
||||
|
||||
The installer detects the platform, finds the BIOS folder, downloads what
|
||||
is missing, and copies keys to standalone emulators (Yuzu, Eden, Ryujinx,
|
||||
DuckStation, PCSX2, Dolphin, etc.) when they are present on the system.
|
||||
|
||||
**Linux / Mac / Steam Deck:**
|
||||
|
||||
```sh
|
||||
curl -fsSL https://raw.githubusercontent.com/Abdess/retrobios/main/install.sh | sh
|
||||
```
|
||||
|
||||
**Windows (PowerShell):**
|
||||
|
||||
```powershell
|
||||
iwr -useb https://raw.githubusercontent.com/Abdess/retrobios/main/install.ps1 | iex
|
||||
```
|
||||
|
||||
Nothing else needed. The installer handles everything.
|
||||
|
||||
---
|
||||
|
||||
## Manual download
|
||||
|
||||
Pick the pack that matches the setup from the [releases page]({rel}),
|
||||
download it, and extract the files into the BIOS folder listed below.
|
||||
After extraction, launch a game. If it needed BIOS, it will find it.
|
||||
|
||||
### Steam Deck
|
||||
|
||||
| Setup | What it is | Pack | Extract to |
|
||||
|-------|-----------|------|-----------|
|
||||
| [EmuDeck](https://www.emudeck.com/) | Installs and configures multiple emulators, adds each game to the Steam library | [EmuDeck]({rel}) | `~/Emulation/bios/` |
|
||||
| [RetroDECK](https://retrodeck.net/) | Single Flatpak app, all emulators bundled, one-click install from Discover | [RetroDECK]({rel}) | `~/retrodeck/` |
|
||||
| RetroArch standalone | Installed from Discover, Steam, or Flatpak | [RetroArch]({rel}) | Open RetroArch > Settings > Directory > System, that is the folder |
|
||||
|
||||
### Windows
|
||||
|
||||
| Setup | What it is | Pack | Extract to |
|
||||
|-------|-----------|------|-----------|
|
||||
| [RetroArch](https://www.retroarch.com/) | Multi-system emulator, loads different cores for each console | [RetroArch]({rel}) | The `system` folder next to `retroarch.exe` |
|
||||
| [RetroBat](https://www.retrobat.org/) | Windows frontend with EmulationStation, includes RetroArch and standalone emulators | [RetroBat]({rel}) | The `bios` folder inside the RetroBat installation |
|
||||
| [BizHawk](https://tasvideos.org/BizHawk) | Accuracy-focused multi-system emulator, popular for speedruns and TAS | [BizHawk]({rel}) | The `Firmware` folder inside the BizHawk installation |
|
||||
| [LaunchBox](https://www.launchbox-app.com/) | Game library manager and launcher, uses RetroArch or standalone emulators behind the scenes | [RetroArch]({rel}) | Open RetroArch (via LaunchBox) > Settings > Directory > System |
|
||||
|
||||
### Linux
|
||||
|
||||
| Setup | What it is | Pack | Extract to |
|
||||
|-------|-----------|------|-----------|
|
||||
| RetroArch (native) | Installed via package manager or AppImage | [RetroArch]({rel}) | `~/.config/retroarch/system/` |
|
||||
| RetroArch (Flatpak) | Installed from Flathub | [RetroArch]({rel}) | `~/.var/app/org.libretro.RetroArch/config/retroarch/system/` |
|
||||
| [Batocera](https://batocera.org/) | Bootable OS dedicated to gaming, runs from USB or full install, supports PC and SBC | [Batocera]({rel}) | `/userdata/bios/` |
|
||||
| [Recalbox](https://www.recalbox.com/) | Bootable OS for retro gaming, streamlined interface, auto-configured | [Recalbox]({rel}) | `/recalbox/share/bios/` |
|
||||
|
||||
### macOS
|
||||
|
||||
| Setup | What it is | Pack | Extract to |
|
||||
|-------|-----------|------|-----------|
|
||||
| [RetroArch](https://www.retroarch.com/) | Multi-system emulator | [RetroArch]({rel}) | `~/Library/Application Support/RetroArch/system/` |
|
||||
|
||||
### Raspberry Pi and single-board computers
|
||||
|
||||
| Setup | What it is | Pack | Extract to |
|
||||
|-------|-----------|------|-----------|
|
||||
| [RetroPie](https://retropie.org.uk/) | The classic Pi emulation setup, largest community, most online guides | [RetroArch]({rel}) | `~/RetroPie/BIOS/` |
|
||||
| [Lakka](https://www.lakka.tv/) | Lightweight RetroArch OS, minimal config, boots straight into the UI | [RetroArch]({rel}) | `/storage/system/` |
|
||||
| [Batocera](https://batocera.org/) | Easy setup, works on Pi 3/4/5 and many other boards (Odroid, etc.) | [Batocera]({rel}) | `/userdata/bios/` |
|
||||
| [Recalbox](https://www.recalbox.com/) | Plug-and-play experience, good for a first build | [Recalbox]({rel}) | `/recalbox/share/bios/` |
|
||||
|
||||
### Android handheld (Retroid Pocket, R36S, Miyoo, etc.)
|
||||
|
||||
Most Android handhelds run RetroArch. Download the [RetroArch pack]({rel})
|
||||
and extract into `RetroArch/system/` on internal storage or SD card.
|
||||
|
||||
### Self-hosted ROM manager
|
||||
|
||||
| Setup | What it is | Pack | Extract to |
|
||||
|-------|-----------|------|-----------|
|
||||
| [RomM](https://github.com/rommapp/romm) | Web-based ROM manager, plays games in the browser via EmulatorJS | [RomM]({rel}) | The `bios` folder in the RomM library, one subfolder per system |
|
||||
|
||||
---
|
||||
|
||||
## Full pack or Platform pack?
|
||||
|
||||
Each platform has two pack types on the [releases page]({rel}).
|
||||
|
||||
**Full pack** (recommended)
|
||||
|
||||
Contains the platform's own BIOS list plus all files needed by each
|
||||
emulator core available on that platform. This covers alternate cores,
|
||||
optional firmware that improves accuracy, and edge cases. Larger download,
|
||||
but everything works out of the box with any core.
|
||||
|
||||
**Platform pack**
|
||||
|
||||
Contains only the files the platform officially checks for. Much smaller
|
||||
download. Good for limited storage (SD cards, handhelds) or setups that
|
||||
only use default cores.
|
||||
|
||||
When in doubt, take the full pack.
|
||||
|
||||
---
|
||||
|
||||
## After extraction
|
||||
|
||||
Launch a game. If it needed a BIOS file, the emulator will find it
|
||||
automatically. No configuration needed.
|
||||
|
||||
If a game still asks for a missing file, check the
|
||||
[platforms section](platforms/index.md) for the full file list, or the
|
||||
[emulators section](emulators/index.md) for what each core expects.
|
||||
"""
|
||||
|
||||
|
||||
def generate_mkdocs_nav(
|
||||
coverages: dict,
|
||||
manufacturers: dict,
|
||||
@@ -2127,10 +2336,12 @@ def generate_mkdocs_nav(
|
||||
{"Adding a scraper": "wiki/adding-a-scraper.md"},
|
||||
{"Testing guide": "wiki/testing-guide.md"},
|
||||
{"Release process": "wiki/release-process.md"},
|
||||
{"Community tools": "wiki/community-tools.md"},
|
||||
]
|
||||
|
||||
return [
|
||||
{"Home": "index.md"},
|
||||
{"Download": "which-pack.md"},
|
||||
{"Platforms": platform_nav},
|
||||
{"Systems": system_nav},
|
||||
{"Emulators": emu_nav},
|
||||
@@ -2174,6 +2385,15 @@ def main():
|
||||
css_dest.parent.mkdir(parents=True, exist_ok=True)
|
||||
shutil.copy2(css_src, css_dest)
|
||||
|
||||
# Copy branding assets
|
||||
images_dest = docs / "assets" / "images"
|
||||
images_dest.mkdir(parents=True, exist_ok=True)
|
||||
assets_src = Path(".github") / "assets"
|
||||
for name, dest_name in [("logo.png", "logo.png"), ("favicon.png", "favicon.png")]:
|
||||
src = assets_src / name
|
||||
if src.exists():
|
||||
shutil.copy2(src, images_dest / dest_name)
|
||||
|
||||
registry_path = Path(args.platforms_dir) / "_registry.yml"
|
||||
registry = {}
|
||||
if registry_path.exists():
|
||||
@@ -2284,6 +2504,10 @@ def main():
|
||||
str(wiki_dest / "data-model.md"), generate_wiki_data_model(db, profiles)
|
||||
)
|
||||
|
||||
# Generate which-pack page
|
||||
print("Generating which-pack page...")
|
||||
write_if_changed(str(docs / "which-pack.md"), generate_which_pack())
|
||||
|
||||
# Generate contributing
|
||||
print("Generating contributing page...")
|
||||
write_if_changed(str(docs / "contributing.md"), generate_contributing())
|
||||
@@ -2319,6 +2543,8 @@ theme:
|
||||
icon: material/brightness-4
|
||||
name: Switch to auto
|
||||
font: false
|
||||
logo: assets/images/logo.png
|
||||
favicon: assets/images/favicon.png
|
||||
icon:
|
||||
logo: material/chip
|
||||
features:
|
||||
|
||||
@@ -298,13 +298,23 @@ def _name_in_index(
|
||||
by_name: dict,
|
||||
by_path_suffix: dict | None = None,
|
||||
data_names: set[str] | None = None,
|
||||
by_name_lower: dict[str, str] | None = None,
|
||||
) -> bool:
|
||||
"""Check if a name is resolvable in the database indexes or data directories."""
|
||||
# Strip trailing slash for directory-type entries (e.g. nestopia/samples/foo/)
|
||||
name = name.rstrip("/")
|
||||
if name in by_name:
|
||||
return True
|
||||
basename = name.rsplit("/", 1)[-1]
|
||||
basename = name.rsplit("/", 1)[-1] if "/" in name else name
|
||||
if basename != name and basename in by_name:
|
||||
return True
|
||||
# Case-insensitive by_name lookup
|
||||
if by_name_lower:
|
||||
key = name.lower()
|
||||
if key in by_name_lower:
|
||||
return True
|
||||
if basename != name and basename.lower() in by_name_lower:
|
||||
return True
|
||||
if by_path_suffix and name in by_path_suffix:
|
||||
return True
|
||||
if data_names:
|
||||
@@ -345,6 +355,7 @@ def find_undeclared_files(
|
||||
declared_dd.add(ref)
|
||||
|
||||
by_name = db.get("indexes", {}).get("by_name", {})
|
||||
by_name_lower = {k.lower(): k for k in by_name}
|
||||
by_path_suffix = db.get("indexes", {}).get("by_path_suffix", {})
|
||||
profiles = (
|
||||
emu_profiles
|
||||
@@ -378,6 +389,10 @@ def find_undeclared_files(
|
||||
fname = f.get("name", "")
|
||||
if not fname or fname in seen_files:
|
||||
continue
|
||||
# Skip unsourceable files (documented reason, not a gap)
|
||||
if f.get("unsourceable"):
|
||||
seen_files.add(fname)
|
||||
continue
|
||||
# Skip pattern placeholders (e.g., <user-selected>.bin)
|
||||
if "<" in fname or ">" in fname or "*" in fname:
|
||||
continue
|
||||
@@ -416,7 +431,8 @@ def find_undeclared_files(
|
||||
if archive:
|
||||
if archive not in archive_entries:
|
||||
in_repo = _name_in_index(
|
||||
archive, by_name, by_path_suffix, data_names
|
||||
archive, by_name, by_path_suffix, data_names,
|
||||
by_name_lower,
|
||||
)
|
||||
archive_entries[archive] = {
|
||||
"emulator": profile.get("emulator", emu_name),
|
||||
@@ -447,11 +463,20 @@ def find_undeclared_files(
|
||||
else:
|
||||
dest = f.get("path") or fname
|
||||
|
||||
# Resolution: try name, then path basename, then path_suffix
|
||||
in_repo = _name_in_index(fname, by_name, by_path_suffix, data_names)
|
||||
if not in_repo and dest != fname:
|
||||
path_base = dest.rsplit("/", 1)[-1]
|
||||
in_repo = _name_in_index(path_base, by_name, by_path_suffix, data_names)
|
||||
# Resolution: storage flag, then name, then path basename
|
||||
storage = f.get("storage", "")
|
||||
if storage in ("release", "large_file"):
|
||||
in_repo = True
|
||||
else:
|
||||
in_repo = _name_in_index(
|
||||
fname, by_name, by_path_suffix, data_names, by_name_lower,
|
||||
)
|
||||
if not in_repo and dest != fname:
|
||||
path_base = dest.rsplit("/", 1)[-1]
|
||||
in_repo = _name_in_index(
|
||||
path_base, by_name, by_path_suffix, data_names,
|
||||
by_name_lower,
|
||||
)
|
||||
|
||||
checks = _parse_validation(f.get("validation"))
|
||||
undeclared.append(
|
||||
|
||||
@@ -994,8 +994,10 @@ class TestE2E(unittest.TestCase):
|
||||
groups = group_identical_platforms(
|
||||
["test_existence", "test_inherited"], self.platforms_dir
|
||||
)
|
||||
# Different base_destination ->separate groups
|
||||
self.assertEqual(len(groups), 2)
|
||||
# With flat ZIPs, base_destination no longer separates groups
|
||||
# Platforms with same files (regardless of base_dest) are grouped
|
||||
self.assertEqual(len(groups), 1)
|
||||
self.assertEqual(len(groups[0][0]), 2)
|
||||
|
||||
def test_51_platform_grouping_same(self):
|
||||
# Create two identical platforms
|
||||
@@ -3383,10 +3385,17 @@ class TestE2E(unittest.TestCase):
|
||||
registry_path,
|
||||
emulators_dir=self.emulators_dir,
|
||||
)
|
||||
# Detect flat vs nested ZIP to build expected paths
|
||||
base = manifest.get("base_destination", "")
|
||||
is_flat = bool(base) and not any(
|
||||
n.startswith(base + "/") for n in zip_names
|
||||
)
|
||||
manifest_dests = set()
|
||||
for f in manifest["files"]:
|
||||
d = f"{base}/{f['dest']}" if base else f["dest"]
|
||||
if base and not is_flat:
|
||||
d = f"{base}/{f['dest']}"
|
||||
else:
|
||||
d = f["dest"]
|
||||
manifest_dests.add(d)
|
||||
|
||||
self.assertEqual(manifest_dests, zip_names)
|
||||
|
||||
@@ -324,10 +324,13 @@ python scripts/pipeline.py --offline
|
||||
This executes in sequence:
|
||||
|
||||
1. `generate_db.py` - rebuild `database.json` from `bios/`
|
||||
2. `refresh_data_dirs.py` - update data directories
|
||||
2. `refresh_data_dirs.py` - update data directories (skipped with `--offline`)
|
||||
3. `verify.py --all` - verify all platforms including the new one
|
||||
4. `generate_pack.py --all` - build ZIP packs
|
||||
4. `generate_pack.py --all` - build ZIP packs + install manifests
|
||||
5. Consistency check - verify counts match between verify and pack
|
||||
6. Pack integrity - extract ZIPs and verify hashes per platform mode
|
||||
7. `generate_readme.py` - regenerate README
|
||||
8. `generate_site.py` - regenerate documentation site
|
||||
|
||||
Check the output for:
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ Upstream sources Scrapers parse generate_db.py scans
|
||||
batocera-systems builds database.json
|
||||
es_bios.xml (recalbox) (SHA1 primary key,
|
||||
core-info .info files indexes: by_md5, by_name,
|
||||
FirmwareDatabase.cs by_crc32, by_path_suffix)
|
||||
FirmwareDatabase.cs by_crc32, by_sha256, by_path_suffix)
|
||||
MAME/FBNeo source
|
||||
|
||||
emulators/*.yml verify.py checks generate_pack.py resolves
|
||||
@@ -236,11 +236,11 @@ user's platform, filter files by hardware target, and download with SHA1 verific
|
||||
|
||||
## Tests
|
||||
|
||||
5 test files, 249 tests total:
|
||||
5 test files, 259 tests total:
|
||||
|
||||
| File | Tests | Coverage |
|
||||
|------|-------|----------|
|
||||
| `test_e2e.py` | 186 | file resolution, verification, severity, cross-reference, aliases, inheritance, shared groups, data dirs, storage tiers, HLE, launchers, platform grouping, core resolution, target filtering, truth/diff, exporters |
|
||||
| `test_e2e.py` | 196 | file resolution, verification, severity, cross-reference, aliases, inheritance, shared groups, data dirs, storage tiers, HLE, launchers, platform grouping, core resolution, target filtering, truth/diff, exporters |
|
||||
| `test_pack_integrity.py` | 8 | extract ZIP packs to disk, verify paths + hashes per platform's native mode |
|
||||
| `test_mame_parser.py` | 22 | BIOS root set detection, ROM block parsing, macro expansion |
|
||||
| `test_fbneo_parser.py` | 16 | BIOS set detection, ROM info parsing |
|
||||
@@ -254,7 +254,7 @@ python -m unittest tests.test_e2e -v
|
||||
|
||||
| Workflow | File | Trigger | Role |
|
||||
|----------|------|---------|------|
|
||||
| Build & Release | `build.yml` | `workflow_dispatch` (manual) | restore large files, build packs, create GitHub release |
|
||||
| Build & Release | `build.yml` | push to main (bios/, platforms/) + manual | restore large files, build packs, create GitHub release |
|
||||
| Deploy Site | `deploy-site.yml` | push to main (platforms, emulators, wiki, scripts) + manual | generate site, build with MkDocs, deploy to GitHub Pages |
|
||||
| PR Validation | `validate.yml` | pull request on `bios/`/`platforms/` | validate BIOS hashes, schema check, run tests, auto-label PR |
|
||||
| Weekly Sync | `watch.yml` | cron (Monday 6 AM UTC) + manual | scrape upstream sources, detect changes, create update PR |
|
||||
|
||||
21
wiki/community-tools.md
Normal file
21
wiki/community-tools.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# Community tools
|
||||
|
||||
Projects built on RetroBIOS data.
|
||||
|
||||
---
|
||||
|
||||
## BIOS Preservation Tool
|
||||
|
||||
**Author:** [monster-penguin](https://github.com/monster-penguin)
|
||||
**Repository:** [github.com/monster-penguin/BIOS-Preservation-Tool](https://github.com/monster-penguin/BIOS-Preservation-Tool)
|
||||
**License:** MIT
|
||||
|
||||
A local tool for managing your own BIOS collection. Point it at your files, it verifies them against RetroBIOS platform YAMLs, stores them in a deduplicated database, and produces ready-to-use directories for each platform. Supports scanning directories, archives, and URLs.
|
||||
|
||||
See the project's [README](https://github.com/monster-penguin/BIOS-Preservation-Tool#readme) for setup and usage.
|
||||
|
||||
---
|
||||
|
||||
!!! note "Add your project"
|
||||
|
||||
Open an issue with a link to your repository.
|
||||
@@ -89,13 +89,15 @@ A hash is a fixed-length fingerprint computed from a file's contents. If even on
|
||||
| SHA1 | 40 hex chars | `10155d8d6e6e832d8ea1571511e40dfb15fede05` |
|
||||
| CRC32 | 8 hex chars | `2F468B96` |
|
||||
|
||||
Different platforms use different hash types for verification. Batocera uses MD5, RetroArch checks existence only, and RomM accepts any of the three.
|
||||
Different platforms use different hash types for verification. Batocera uses MD5, RetroArch checks existence only, BizHawk uses SHA1, and RomM uses MD5.
|
||||
|
||||
## Why does my verification report say UNTESTED?
|
||||
|
||||
UNTESTED means the file exists on disk but its hash was not confirmed against a known value. This happens on existence-mode platforms (RetroArch, Lakka, RetroPie) where the platform only checks that the file is present, without verifying its contents.
|
||||
UNTESTED means the file exists on disk but its hash does not match the expected value. This happens on MD5/SHA1-mode platforms (Batocera, Recalbox, BizHawk, etc.) when the file is present but contains different data than what the platform declares.
|
||||
|
||||
The file may still be correct. Running `verify.py --emulator <core> --verbose` shows the emulator-level ground truth, which can confirm whether the file's hash matches what the source code expects.
|
||||
On existence-mode platforms (RetroArch, Lakka, RetroPie), files are never UNTESTED because the platform only checks presence, not content. Those files show as OK if present.
|
||||
|
||||
Running `verify.py --emulator <core> --verbose` shows the emulator-level ground truth, which can confirm whether the file's hash matches what the source code expects.
|
||||
|
||||
## Can I use BIOS from one platform on another?
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ Relative to the RetroBat installation directory (e.g., `C:\RetroBat\bios\`).
|
||||
### RetroDECK
|
||||
|
||||
```
|
||||
~/.var/app/net.retrodeck.retrodeck/retrodeck/bios/
|
||||
~/retrodeck/bios/
|
||||
```
|
||||
|
||||
### EmuDeck
|
||||
|
||||
@@ -28,12 +28,16 @@ If you just want to download BIOS packs, see the [home page](../index.md).
|
||||
|
||||
See [contributing](../contributing.md) for submission guidelines.
|
||||
|
||||
## Community
|
||||
|
||||
- **[Community tools](community-tools.md)** - projects built on RetroBIOS data
|
||||
|
||||
## Glossary
|
||||
|
||||
- **BIOS** - firmware burned into console hardware, needed by emulators that rely on original boot code
|
||||
- **firmware** - system software loaded by a console at boot; used interchangeably with BIOS in this project
|
||||
- **HLE** - High-Level Emulation; software reimplementation of BIOS functions, avoids needing the original file
|
||||
- **hash** - fixed-length fingerprint of a file's contents; this project uses MD5, SHA1, SHA256, and CRC32
|
||||
- **hash** - fixed-length fingerprint of a file's contents; this project uses MD5, SHA1, SHA256, CRC32, and Adler-32
|
||||
- **platform** - a distribution that packages emulators (RetroArch, Batocera, Recalbox, EmuDeck, etc.)
|
||||
- **core** - an emulator packaged as a libretro plugin, loaded by RetroArch or compatible frontends
|
||||
- **profile** - a YAML file in `emulators/` documenting one core's BIOS requirements, verified against source code
|
||||
|
||||
@@ -250,7 +250,7 @@ even if documentation mentions it.
|
||||
|-------|----------|-------------|
|
||||
| `emulator` | yes | display name |
|
||||
| `type` | yes | `libretro`, `standalone`, `standalone + libretro`, `alias`, `launcher`, `game`, `utility`, `test` |
|
||||
| `core_classification` | no | `pure_libretro`, `official_port`, `community_fork`, `frozen_snapshot`, `enhanced_fork`, `game_engine`, `embedded_hle`, `alias`, `launcher` |
|
||||
| `core_classification` | no | `pure_libretro`, `official_port`, `community_fork`, `frozen_snapshot`, `enhanced_fork`, `game_engine`, `embedded_hle`, `launcher`, `other` |
|
||||
| `source` | yes | libretro core repository URL |
|
||||
| `upstream` | no | original emulator repository URL |
|
||||
| `profiled_date` | yes | date of source analysis |
|
||||
@@ -276,6 +276,7 @@ even if documentation mentions it.
|
||||
| `size` | expected size in bytes |
|
||||
| `min_size`, `max_size` | size range when the code accepts a range |
|
||||
| `md5`, `sha1`, `crc32`, `sha256` | expected hashes from source code |
|
||||
| `known_hash_adler32` | expected Adler-32 hash (used by Dolphin IPL files) |
|
||||
| `validation` | checks the code performs: `size`, `crc32`, `md5`, `sha1`, `adler32`, `signature`, `crypto`. Can be a list or dict `{core: [...], upstream: [...]}` for divergent checks |
|
||||
| `aliases` | alternate filenames for the same file |
|
||||
| `mode` | `libretro`, `standalone`, or `both` |
|
||||
@@ -288,4 +289,7 @@ even if documentation mentions it.
|
||||
| `note` | additional context |
|
||||
| `contents` | structure of files inside a BIOS ZIP (`name`, `description`, `size`, `crc32`) |
|
||||
| `storage` | `large_file` for files > 50 MB stored as release assets |
|
||||
| `agnostic` | true if any file under the system path within size constraints satisfies the requirement |
|
||||
| `unsourceable` | reason why the file cannot be sourced (acknowledged gap) |
|
||||
| `destination` | target path within the BIOS directory |
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ Run everything in sequence:
|
||||
|
||||
```bash
|
||||
python scripts/pipeline.py --offline # DB + verify + packs + manifests + integrity + readme + site
|
||||
python scripts/pipeline.py --offline --skip-packs # DB + verify only
|
||||
python scripts/pipeline.py --offline --skip-packs # DB + verify + readme + site
|
||||
python scripts/pipeline.py --offline --skip-docs # skip readme + site generation
|
||||
python scripts/pipeline.py --offline --target switch # filter by hardware target
|
||||
python scripts/pipeline.py --offline --with-truth # include truth generation + diff
|
||||
|
||||
@@ -18,8 +18,8 @@ cannot start games for that system at all.
|
||||
|
||||
**Check if the hash matches:**
|
||||
|
||||
Look for `HASH_MISMATCH` in the verify output. This means the file exists but
|
||||
contains different data than expected. Common causes:
|
||||
Look for `untested` entries in the verify output. This means the file exists but
|
||||
its hash does not match the expected value. Common causes:
|
||||
|
||||
- Wrong region (a PAL BIOS instead of NTSC, or vice versa)
|
||||
- Wrong hardware revision (e.g. SCPH-5501 vs SCPH-1001 for PlayStation)
|
||||
@@ -72,13 +72,11 @@ filename from the emulator profile.
|
||||
|
||||
## Hash mismatch / UNTESTED
|
||||
|
||||
`verify.py` reports `HASH_MISMATCH` or `UNTESTED` for a file.
|
||||
|
||||
**HASH_MISMATCH:**
|
||||
`verify.py` reports `UNTESTED` for a file.
|
||||
|
||||
The file exists and was hashed, but the computed hash doesn't match any expected
|
||||
value. This means you have a different version of the file than what the platform
|
||||
or emulator expects.
|
||||
or emulator expects. The reason field shows the expected vs actual hash prefix.
|
||||
|
||||
To find the correct version, check the system page on the site. It lists every
|
||||
known BIOS file with its expected MD5 and SHA1.
|
||||
@@ -147,10 +145,11 @@ How to read and interpret `verify.py` output.
|
||||
| Status | Meaning |
|
||||
|--------|---------|
|
||||
| `ok` | File present, hash matches (or existence check passed) |
|
||||
| `untested` | File present, hash not confirmed (existence-only platforms) |
|
||||
| `untested` | File present, hash not confirmed against expected value |
|
||||
| `missing` | File not found in the repository |
|
||||
| `hash_mismatch` | File found but hash doesn't match expected value |
|
||||
| `size_mismatch` | File found but size doesn't match what the emulator expects |
|
||||
|
||||
Hash and size mismatches are reported as `untested` with a reason field
|
||||
showing expected vs actual values (e.g., `expected abc123… got def456…`).
|
||||
|
||||
**Reading the output:**
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ Recalbox uses three severity levels derived from two YAML fields (`mandatory` an
|
||||
|-----------|--------------------|--------|-------------------|
|
||||
| true | true | RED | CRITICAL |
|
||||
| true | false | YELLOW | WARNING |
|
||||
| false | (any) | GREEN | INFO |
|
||||
| false | (any) | GREEN | WARNING |
|
||||
|
||||
### checkInsideZip (Batocera zippedFile)
|
||||
|
||||
@@ -93,9 +93,10 @@ If the inner file is not found inside the ZIP, the status is UNTESTED with a rea
|
||||
|
||||
### RomM verification
|
||||
|
||||
RomM checks both file size and hash. It accepts any hash type (MD5, SHA1, or CRC32).
|
||||
ZIP files are not opened; only the container is checked. `verify.py` replicates this
|
||||
by checking size first, then trying each available hash.
|
||||
RomM uses MD5 verification (`verification_mode: md5`). The platform YAML stores
|
||||
SHA1, MD5, and CRC32 for reference, but `verify.py` checks only the MD5 field,
|
||||
matching the platform's runtime behavior. ZIP files are not opened; only the
|
||||
container is checked.
|
||||
|
||||
|
||||
## SHA1 Mode
|
||||
|
||||
Reference in New Issue
Block a user