mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-04-18 23:02:33 -05:00
Compare commits
50 Commits
cbb86c7746
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| e90095abd9 | |||
| c8b27cac5e | |||
| 1d191ff190 | |||
| 5a6b54c195 | |||
| e5ef253892 | |||
| 4ba8648ec2 | |||
| 617f5cc364 | |||
| 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 | |||
| 5ee81b30c6 | |||
| b5eae226cd | |||
| fd4606885e | |||
| ded903ed7a | |||
| 077392bcd9 | |||
| f4626ce3bd | |||
| 9e184f76fc | |||
| fa0ed63718 | |||
| c3fa55bd46 | |||
| 0401d058a1 | |||
| 95b7a9813c | |||
| 22829cfab9 | |||
| 2326306f2b | |||
| 28ecf19f2b | |||
| 91925120c9 |
Binary file not shown.
|
After Width: | Height: | Size: 246 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 135 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
+26
-10
@@ -58,16 +58,32 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
mkdir -p .cache/large
|
mkdir -p .cache/large
|
||||||
gh release download large-files -D .cache/large/ 2>/dev/null || true
|
gh release download large-files -D .cache/large/ 2>/dev/null || true
|
||||||
for f in .cache/large/*; do
|
python3 -c "
|
||||||
[ -f "$f" ] || continue
|
import hashlib, json, os, shutil
|
||||||
name=$(basename "$f")
|
db = json.load(open('database.json'))
|
||||||
target=$(grep "$name" .gitignore | head -1)
|
with open('.gitignore') as f:
|
||||||
if [ -n "$target" ] && [ ! -f "$target" ]; then
|
ignored = {l.strip() for l in f if l.strip().startswith('bios/')}
|
||||||
mkdir -p "$(dirname "$target")"
|
cache = '.cache/large'
|
||||||
cp "$f" "$target"
|
if not os.path.isdir(cache):
|
||||||
echo "Restored: $target"
|
exit(0)
|
||||||
fi
|
idx = {}
|
||||||
done
|
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:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,43 @@ jobs:
|
|||||||
|
|
||||||
- run: pip install pyyaml mkdocs-material pymdown-extensions
|
- 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
|
- name: Generate site
|
||||||
run: |
|
run: |
|
||||||
python scripts/generate_site.py
|
python scripts/generate_site.py
|
||||||
|
|||||||
@@ -7,6 +7,16 @@
|
|||||||
3. Variants (alternate hashes): `bios/Manufacturer/Console/.variants/`
|
3. Variants (alternate hashes): `bios/Manufacturer/Console/.variants/`
|
||||||
4. Create a Pull Request - checksums are verified automatically
|
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
|
## File conventions
|
||||||
|
|
||||||
- Files >50 MB go in GitHub release assets (`large-files` release)
|
- Files >50 MB go in GitHub release assets (`large-files` release)
|
||||||
|
|||||||
@@ -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.
|
Complete BIOS and firmware packs for Batocera, BizHawk, EmuDeck, Lakka, Recalbox, RetroArch, RetroBat, RetroDECK, RetroPie, and RomM.
|
||||||
|
|
||||||
**7,295** 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
|
## 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
|
- **10 platforms** supported with platform-specific verification
|
||||||
- **329 emulators** profiled from source (RetroArch cores + standalone)
|
- **329 emulators** profiled from source (RetroArch cores + standalone)
|
||||||
- **396 systems** covered (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
|
- **396 systems** covered (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
|
||||||
- **7,295 files** verified with MD5, SHA1, CRC32 checksums
|
- **7,302 files** verified with MD5, SHA1, CRC32 checksums
|
||||||
- **8765 MB** total collection size
|
- **8765 MB** total collection size
|
||||||
|
|
||||||
## Supported systems
|
## 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>
|
<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
|
## Contributing
|
||||||
|
|
||||||
See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
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.
|
This repository provides BIOS files for personal backup and archival purposes.
|
||||||
|
|
||||||
*Auto-generated on 2026-03-31T20:38:37Z*
|
*Auto-generated on 2026-04-03T12:59:52Z*
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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(乾坤一擲)=使用金錢鏢攻擊敵方全體,*會耗損大量金錢。
|
||||||
+7497
-97
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,578 @@
|
|||||||
|
/* RetroBIOS custom theme */
|
||||||
|
|
||||||
|
/* ── Color palette ── */
|
||||||
|
:root {
|
||||||
|
--rb-primary: #4a4e8a;
|
||||||
|
--rb-primary-light: #6366a0;
|
||||||
|
--rb-primary-dark: #363870;
|
||||||
|
--rb-accent: #e8594f;
|
||||||
|
--rb-success: #2e7d32;
|
||||||
|
--rb-warning: #f57c00;
|
||||||
|
--rb-danger: #c62828;
|
||||||
|
--rb-info: #1565c0;
|
||||||
|
--rb-muted: #78909c;
|
||||||
|
--rb-surface: #f5f6fa;
|
||||||
|
--rb-border: #e0e3eb;
|
||||||
|
--rb-text-secondary: #546e7a;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-md-color-scheme="slate"] {
|
||||||
|
--rb-surface: #1e1e2e;
|
||||||
|
--rb-border: #313244;
|
||||||
|
--rb-text-secondary: #a6adc8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Material theme overrides ── */
|
||||||
|
[data-md-color-scheme="default"] {
|
||||||
|
--md-primary-fg-color: var(--rb-primary);
|
||||||
|
--md-primary-fg-color--light: var(--rb-primary-light);
|
||||||
|
--md-primary-fg-color--dark: var(--rb-primary-dark);
|
||||||
|
--md-accent-fg-color: var(--rb-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-md-color-scheme="slate"] {
|
||||||
|
--md-primary-fg-color: var(--rb-primary-light);
|
||||||
|
--md-accent-fg-color: var(--rb-accent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Hero section (home page) ── */
|
||||||
|
.rb-hero {
|
||||||
|
background: linear-gradient(135deg, var(--rb-primary) 0%, var(--rb-primary-dark) 100%);
|
||||||
|
color: white;
|
||||||
|
padding: 2.5rem 2rem;
|
||||||
|
border-radius: 12px;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-hero::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
width: 300px;
|
||||||
|
height: 100%;
|
||||||
|
background: linear-gradient(135deg, transparent 40%, rgba(255,255,255,0.04) 100%);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-hero h1 {
|
||||||
|
margin: 0 0 0.5rem;
|
||||||
|
font-size: 2rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: white !important;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-hero p {
|
||||||
|
margin: 0;
|
||||||
|
opacity: 0.9;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Stat cards ── */
|
||||||
|
.rb-stats {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
|
||||||
|
gap: 1rem;
|
||||||
|
margin: 1.5rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-stat {
|
||||||
|
background: var(--rb-surface);
|
||||||
|
border: 1px solid var(--rb-border);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 1.2rem;
|
||||||
|
text-align: center;
|
||||||
|
transition: transform 0.15s ease, box-shadow 0.15s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-stat:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 4px 12px rgba(0,0,0,0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-stat .rb-stat-value {
|
||||||
|
font-size: 1.8rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--rb-primary);
|
||||||
|
line-height: 1.2;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-md-color-scheme="slate"] .rb-stat .rb-stat-value {
|
||||||
|
color: var(--rb-primary-light);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-stat .rb-stat-label {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
color: var(--rb-text-secondary);
|
||||||
|
margin-top: 0.3rem;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Progress bars (inline) ── */
|
||||||
|
.rb-progress {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-progress-bar {
|
||||||
|
flex: 1;
|
||||||
|
height: 6px;
|
||||||
|
background: var(--rb-border);
|
||||||
|
border-radius: 3px;
|
||||||
|
overflow: hidden;
|
||||||
|
min-width: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-progress-fill {
|
||||||
|
height: 100%;
|
||||||
|
border-radius: 3px;
|
||||||
|
transition: width 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-progress-fill[data-level="high"] { background: var(--rb-success); }
|
||||||
|
.rb-progress-fill[data-level="mid"] { background: var(--rb-warning); }
|
||||||
|
.rb-progress-fill[data-level="low"] { background: var(--rb-danger); }
|
||||||
|
|
||||||
|
.rb-progress-text {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
font-weight: 600;
|
||||||
|
white-space: nowrap;
|
||||||
|
min-width: 3.5em;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Status badges ── */
|
||||||
|
.rb-badge {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0.15em 0.6em;
|
||||||
|
border-radius: 10px;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.02em;
|
||||||
|
line-height: 1.5;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-badge-success { background: #e8f5e9; color: #1b5e20; }
|
||||||
|
.rb-badge-warning { background: #fff3e0; color: #e65100; }
|
||||||
|
.rb-badge-danger { background: #ffebee; color: #b71c1c; }
|
||||||
|
.rb-badge-info { background: #e3f2fd; color: #0d47a1; }
|
||||||
|
.rb-badge-muted { background: #eceff1; color: #455a64; }
|
||||||
|
|
||||||
|
[data-md-color-scheme="slate"] .rb-badge-success { background: #1b5e20; color: #a5d6a7; }
|
||||||
|
[data-md-color-scheme="slate"] .rb-badge-warning { background: #e65100; color: #ffcc80; }
|
||||||
|
[data-md-color-scheme="slate"] .rb-badge-danger { background: #b71c1c; color: #ef9a9a; }
|
||||||
|
[data-md-color-scheme="slate"] .rb-badge-info { background: #0d47a1; color: #90caf9; }
|
||||||
|
[data-md-color-scheme="slate"] .rb-badge-muted { background: #37474f; color: #b0bec5; }
|
||||||
|
|
||||||
|
/* ── Tables ── */
|
||||||
|
.md-typeset table:not([class]) {
|
||||||
|
border-collapse: separate;
|
||||||
|
border-spacing: 0;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
border: 1px solid var(--rb-border);
|
||||||
|
border-radius: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset table:not([class]) th {
|
||||||
|
background: var(--rb-surface);
|
||||||
|
font-weight: 600;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
color: var(--rb-text-secondary);
|
||||||
|
padding: 0.75rem 1rem;
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset table:not([class]) td {
|
||||||
|
padding: 0.6rem 1rem;
|
||||||
|
border-top: 1px solid var(--rb-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset table:not([class]) tbody tr:hover {
|
||||||
|
background: rgba(74, 78, 138, 0.04);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-md-color-scheme="slate"] .md-typeset table:not([class]) tbody tr:hover {
|
||||||
|
background: rgba(99, 102, 160, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Zebra striping */
|
||||||
|
.md-typeset table:not([class]) tbody tr:nth-child(even) {
|
||||||
|
background: rgba(0, 0, 0, 0.015);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-md-color-scheme="slate"] .md-typeset table:not([class]) tbody tr:nth-child(even) {
|
||||||
|
background: rgba(255, 255, 255, 0.02);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Platform cards (home page) ── */
|
||||||
|
.rb-platform-row td:first-child img {
|
||||||
|
vertical-align: middle;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Quick start grid ── */
|
||||||
|
.rb-quickstart {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
||||||
|
gap: 0.75rem;
|
||||||
|
margin: 1rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-quickstart-item {
|
||||||
|
background: var(--rb-surface);
|
||||||
|
border: 1px solid var(--rb-border);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 0.8rem 1rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-quickstart-item code {
|
||||||
|
background: transparent;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--rb-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Section separators ── */
|
||||||
|
.rb-section {
|
||||||
|
margin-top: 2rem;
|
||||||
|
padding-top: 1.5rem;
|
||||||
|
border-top: 1px solid var(--rb-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Methodology steps ── */
|
||||||
|
.rb-methodology ol {
|
||||||
|
counter-reset: method-step;
|
||||||
|
list-style: none;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-methodology ol li {
|
||||||
|
counter-increment: method-step;
|
||||||
|
padding: 0.6rem 0 0.6rem 2.5rem;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-methodology ol li::before {
|
||||||
|
content: counter(method-step);
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0.5rem;
|
||||||
|
width: 1.8rem;
|
||||||
|
height: 1.8rem;
|
||||||
|
background: var(--rb-primary);
|
||||||
|
color: white;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Classification badges (emulators) ── */
|
||||||
|
.rb-cls-official_port { border-left: 3px solid var(--rb-success); }
|
||||||
|
.rb-cls-community_fork { border-left: 3px solid var(--rb-info); }
|
||||||
|
.rb-cls-pure_libretro { border-left: 3px solid var(--rb-primary); }
|
||||||
|
.rb-cls-game_engine { border-left: 3px solid #7b1fa2; }
|
||||||
|
.rb-cls-enhanced_fork { border-left: 3px solid #00838f; }
|
||||||
|
.rb-cls-frozen_snapshot { border-left: 3px solid var(--rb-muted); }
|
||||||
|
.rb-cls-embedded_hle { border-left: 3px solid #4e342e; }
|
||||||
|
.rb-cls-launcher { border-left: 3px solid #37474f; }
|
||||||
|
|
||||||
|
/* ── Gap analysis priority markers ── */
|
||||||
|
.rb-gap-required {
|
||||||
|
color: var(--rb-danger);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-gap-optional {
|
||||||
|
color: var(--rb-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Scrollable table container improvements ── */
|
||||||
|
.md-typeset__scrollwrap {
|
||||||
|
margin: 1rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Footer timestamp ── */
|
||||||
|
.rb-timestamp {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
color: var(--rb-text-secondary);
|
||||||
|
margin-top: 2rem;
|
||||||
|
padding-top: 1rem;
|
||||||
|
border-top: 1px solid var(--rb-border);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Info card (platform/emulator metadata) ── */
|
||||||
|
.rb-info-card {
|
||||||
|
background: var(--rb-surface);
|
||||||
|
border: 1px solid var(--rb-border);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 1rem 1.2rem;
|
||||||
|
margin: 1rem 0;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: auto 1fr;
|
||||||
|
gap: 0.3rem 1.2rem;
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-info-card dt {
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--rb-text-secondary);
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-info-card dd {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── File entry cards (emulator detail) ── */
|
||||||
|
.rb-file-entry {
|
||||||
|
background: var(--rb-surface);
|
||||||
|
border: 1px solid var(--rb-border);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 1rem 1.2rem;
|
||||||
|
margin: 0.75rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-file-entry-required {
|
||||||
|
border-left: 3px solid var(--rb-danger);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-file-entry-optional {
|
||||||
|
border-left: 3px solid var(--rb-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-file-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-file-header code {
|
||||||
|
font-size: 0.95rem;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-file-entry ul {
|
||||||
|
margin: 0.3rem 0 0;
|
||||||
|
padding-left: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-file-entry li {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
margin: 0.15rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Hash display (truncated with tooltip) ── */
|
||||||
|
.rb-hash {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 0.78rem;
|
||||||
|
color: var(--rb-text-secondary);
|
||||||
|
cursor: help;
|
||||||
|
letter-spacing: -0.02em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* System page file cards */
|
||||||
|
.rb-sys-file {
|
||||||
|
background: var(--rb-surface);
|
||||||
|
border: 1px solid var(--rb-border);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 0.8rem 1rem;
|
||||||
|
margin: 0.6rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-sys-file > p:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-sys-file ul {
|
||||||
|
margin: 0.3rem 0 0;
|
||||||
|
padding-left: 1rem;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-sys-file li {
|
||||||
|
margin: 0.1rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Emulator metadata card */
|
||||||
|
.rb-meta-card {
|
||||||
|
background: var(--rb-surface);
|
||||||
|
border: 1px solid var(--rb-border);
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 0.8rem 0;
|
||||||
|
margin: 1rem 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-meta-card table {
|
||||||
|
border: none !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
border-radius: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-meta-card th {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-meta-card td:first-child {
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--rb-text-secondary);
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 140px;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.03em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-meta-card td {
|
||||||
|
border-top: 1px solid var(--rb-border) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-meta-card tr:first-child td {
|
||||||
|
border-top: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Platform detail: coverage bar ── */
|
||||||
|
.rb-coverage-bar {
|
||||||
|
background: var(--rb-border);
|
||||||
|
border-radius: 4px;
|
||||||
|
height: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 0.5rem 0;
|
||||||
|
max-width: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-coverage-fill {
|
||||||
|
height: 100%;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: var(--rb-success);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Emulator index: section accent ── */
|
||||||
|
.md-typeset h2 .rb-cls-dot {
|
||||||
|
display: inline-block;
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
border-radius: 50%;
|
||||||
|
margin-right: 0.4rem;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-dot-official_port { background: var(--rb-success); }
|
||||||
|
.rb-dot-community_fork { background: var(--rb-info); }
|
||||||
|
.rb-dot-pure_libretro { background: var(--rb-primary); }
|
||||||
|
.rb-dot-game_engine { background: #7b1fa2; }
|
||||||
|
.rb-dot-enhanced_fork { background: #00838f; }
|
||||||
|
.rb-dot-frozen_snapshot { background: var(--rb-muted); }
|
||||||
|
.rb-dot-embedded_hle { background: #4e342e; }
|
||||||
|
.rb-dot-launcher { background: #37474f; }
|
||||||
|
.rb-dot-other { background: #9e9e9e; }
|
||||||
|
|
||||||
|
/* ── Cross-ref: classification in table ── */
|
||||||
|
.rb-cls-label {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
padding: 0.1em 0.5em;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: var(--rb-surface);
|
||||||
|
border: 1px solid var(--rb-border);
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Buttons ── */
|
||||||
|
.md-typeset .md-button {
|
||||||
|
border-radius: 6px;
|
||||||
|
font-weight: 600;
|
||||||
|
text-transform: none;
|
||||||
|
letter-spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pack button in tables: smaller */
|
||||||
|
.md-typeset table .md-button {
|
||||||
|
font-size: 0.75rem;
|
||||||
|
padding: 0.3em 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Hide permalink anchors in hero ── */
|
||||||
|
.rb-hero .headerlink {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Compact stat variant ── */
|
||||||
|
.rb-stats-compact {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 0.5rem;
|
||||||
|
margin: 1rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-stats-compact .rb-stat {
|
||||||
|
padding: 0.6rem 1rem;
|
||||||
|
flex: 1;
|
||||||
|
min-width: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-stats-compact .rb-stat-value {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rb-stats-compact .rb-stat-label {
|
||||||
|
font-size: 0.7rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Responsive ── */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.rb-hero {
|
||||||
|
padding: 1.5rem;
|
||||||
|
}
|
||||||
|
.rb-hero h1 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
.rb-stats {
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
.rb-stat {
|
||||||
|
padding: 0.8rem;
|
||||||
|
}
|
||||||
|
.rb-stat .rb-stat-value {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
}
|
||||||
|
.rb-stat .rb-stat-label {
|
||||||
|
font-size: 0.7rem;
|
||||||
|
}
|
||||||
|
.rb-file-entry {
|
||||||
|
padding: 0.7rem 0.8rem;
|
||||||
|
}
|
||||||
|
.rb-sys-file {
|
||||||
|
padding: 0.6rem 0.8rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
.rb-stats {
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
}
|
||||||
|
.rb-hero h1 {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -59,6 +59,7 @@ files:
|
|||||||
path: sysdata/otp.bin
|
path: sysdata/otp.bin
|
||||||
system: nintendo-3ds
|
system: nintendo-3ds
|
||||||
required: false
|
required: false
|
||||||
|
size: 256
|
||||||
validation: [size, crypto]
|
validation: [size, crypto]
|
||||||
note: "OTP data for console key derivation"
|
note: "OTP data for console key derivation"
|
||||||
source_ref: "src/core/hw/unique_data.cpp:126-167, src/core/hw/unique_data.cpp:213"
|
source_ref: "src/core/hw/unique_data.cpp:126-167, src/core/hw/unique_data.cpp:213"
|
||||||
@@ -67,6 +68,7 @@ files:
|
|||||||
path: nand/private/movable.sed
|
path: nand/private/movable.sed
|
||||||
system: nintendo-3ds
|
system: nintendo-3ds
|
||||||
required: false
|
required: false
|
||||||
|
size: 320
|
||||||
validation: [size, signature]
|
validation: [size, signature]
|
||||||
note: "console-unique key seed"
|
note: "console-unique key seed"
|
||||||
source_ref: "src/core/hw/unique_data.cpp:170-200, src/core/hw/unique_data.cpp:217"
|
source_ref: "src/core/hw/unique_data.cpp:170-200, src/core/hw/unique_data.cpp:217"
|
||||||
@@ -75,6 +77,7 @@ files:
|
|||||||
path: nand/rw/sys/SecureInfo_A
|
path: nand/rw/sys/SecureInfo_A
|
||||||
system: nintendo-3ds
|
system: nintendo-3ds
|
||||||
required: false
|
required: false
|
||||||
|
size: 273
|
||||||
validation: [size, signature]
|
validation: [size, signature]
|
||||||
note: "console serial and region data"
|
note: "console serial and region data"
|
||||||
source_ref: "src/core/hw/unique_data.cpp:43-92, src/core/hw/unique_data.cpp:205"
|
source_ref: "src/core/hw/unique_data.cpp:43-92, src/core/hw/unique_data.cpp:205"
|
||||||
@@ -83,6 +86,7 @@ files:
|
|||||||
path: nand/rw/sys/LocalFriendCodeSeed_B
|
path: nand/rw/sys/LocalFriendCodeSeed_B
|
||||||
system: nintendo-3ds
|
system: nintendo-3ds
|
||||||
required: false
|
required: false
|
||||||
|
size: 284
|
||||||
validation: [size, signature]
|
validation: [size, signature]
|
||||||
note: "friend code generation seed"
|
note: "friend code generation seed"
|
||||||
source_ref: "src/core/hw/unique_data.cpp:94-123, src/core/hw/unique_data.cpp:209"
|
source_ref: "src/core/hw/unique_data.cpp:94-123, src/core/hw/unique_data.cpp:209"
|
||||||
|
|||||||
@@ -92,10 +92,9 @@ files:
|
|||||||
note: "override_bios=1. Falls back to region BIOS if not found."
|
note: "override_bios=1. Falls back to region BIOS if not found."
|
||||||
|
|
||||||
- name: "ps1_rom.bin"
|
- name: "ps1_rom.bin"
|
||||||
description: "PS3 embedded PS1 BIOS (region-free override)"
|
description: "PS3 embedded PS1 BIOS, first 512KB extracted (region-free override)"
|
||||||
region: "Auto"
|
region: "Auto"
|
||||||
required: false
|
required: false
|
||||||
size: 524288
|
|
||||||
sha1: "c40146361eb8cf670b19fdc9759190257803cab7"
|
sha1: "c40146361eb8cf670b19fdc9759190257803cab7"
|
||||||
md5: "81bbe60ba7a3d1cea1d48c14cbcc647b"
|
md5: "81bbe60ba7a3d1cea1d48c14cbcc647b"
|
||||||
validation: [sha1]
|
validation: [sha1]
|
||||||
|
|||||||
+75
-35
@@ -4,7 +4,7 @@ core_classification: official_port
|
|||||||
source: "https://github.com/libretro/bsnes-libretro"
|
source: "https://github.com/libretro/bsnes-libretro"
|
||||||
upstream: "https://github.com/bsnes-emu/bsnes"
|
upstream: "https://github.com/bsnes-emu/bsnes"
|
||||||
logo: "https://raw.githubusercontent.com/bsnes-emu/bsnes/master/bsnes/target-bsnes/resource/bsnes.svg"
|
logo: "https://raw.githubusercontent.com/bsnes-emu/bsnes/master/bsnes/target-bsnes/resource/bsnes.svg"
|
||||||
profiled_date: "2026-03-23"
|
profiled_date: "2026-04-05"
|
||||||
core_version: "115"
|
core_version: "115"
|
||||||
display_name: "Nintendo - SNES / SFC (bsnes)"
|
display_name: "Nintendo - SNES / SFC (bsnes)"
|
||||||
cores: [bsnes]
|
cores: [bsnes]
|
||||||
@@ -29,71 +29,91 @@ files:
|
|||||||
# program ROM: 2048 x 24-bit words, data ROM: 1024 x 16-bit words
|
# program ROM: 2048 x 24-bit words, data ROM: 1024 x 16-bit words
|
||||||
|
|
||||||
- name: "dsp1.program.rom"
|
- name: "dsp1.program.rom"
|
||||||
size: 6144 # 0x1800
|
system: nintendo-snes
|
||||||
|
size: 6144
|
||||||
|
validation: [size]
|
||||||
required: false
|
required: false
|
||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
note: "NEC uPD7725 program ROM for DSP1. HLE fallback available"
|
note: "NEC uPD7725 program ROM for DSP1"
|
||||||
source_ref: "sfc/cartridge/load.cpp:490-494, heuristics/super-famicom.cpp:601"
|
source_ref: "sfc/cartridge/load.cpp:490-494, heuristics/super-famicom.cpp:601"
|
||||||
|
|
||||||
- name: "dsp1.data.rom"
|
- name: "dsp1.data.rom"
|
||||||
size: 2048 # 0x800
|
system: nintendo-snes
|
||||||
|
size: 2048
|
||||||
|
validation: [size]
|
||||||
required: false
|
required: false
|
||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
note: "NEC uPD7725 data ROM for DSP1. HLE fallback available"
|
note: "NEC uPD7725 data ROM for DSP1"
|
||||||
source_ref: "sfc/cartridge/load.cpp:498-503"
|
source_ref: "sfc/cartridge/load.cpp:498-503"
|
||||||
|
|
||||||
- name: "dsp1b.program.rom"
|
- name: "dsp1b.program.rom"
|
||||||
size: 6144 # 0x1800
|
system: nintendo-snes
|
||||||
|
size: 6144
|
||||||
|
validation: [size]
|
||||||
required: false
|
required: false
|
||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
note: "NEC uPD7725 program ROM for DSP1B (default NEC identifier). HLE fallback available"
|
note: "NEC uPD7725 program ROM for DSP1B (default NEC identifier)"
|
||||||
source_ref: "heuristics/super-famicom.cpp:606"
|
source_ref: "heuristics/super-famicom.cpp:606"
|
||||||
|
|
||||||
- name: "dsp1b.data.rom"
|
- name: "dsp1b.data.rom"
|
||||||
size: 2048 # 0x800
|
system: nintendo-snes
|
||||||
|
size: 2048
|
||||||
|
validation: [size]
|
||||||
required: false
|
required: false
|
||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
note: "NEC uPD7725 data ROM for DSP1B. HLE fallback available"
|
note: "NEC uPD7725 data ROM for DSP1B"
|
||||||
source_ref: "heuristics/super-famicom.cpp:606"
|
source_ref: "heuristics/super-famicom.cpp:606"
|
||||||
|
|
||||||
- name: "dsp2.program.rom"
|
- name: "dsp2.program.rom"
|
||||||
size: 6144 # 0x1800
|
system: nintendo-snes
|
||||||
|
size: 6144
|
||||||
|
validation: [size]
|
||||||
required: false
|
required: false
|
||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
note: "NEC uPD7725 program ROM for DSP2 (Dungeon Master). HLE fallback available"
|
note: "NEC uPD7725 program ROM for DSP2 (Dungeon Master)"
|
||||||
source_ref: "sfc/cartridge/load.cpp:515-520, heuristics/super-famicom.cpp:602"
|
source_ref: "sfc/cartridge/load.cpp:515-520, heuristics/super-famicom.cpp:602"
|
||||||
|
|
||||||
- name: "dsp2.data.rom"
|
- name: "dsp2.data.rom"
|
||||||
size: 2048 # 0x800
|
system: nintendo-snes
|
||||||
|
size: 2048
|
||||||
|
validation: [size]
|
||||||
required: false
|
required: false
|
||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
note: "NEC uPD7725 data ROM for DSP2. HLE fallback available"
|
note: "NEC uPD7725 data ROM for DSP2"
|
||||||
source_ref: "sfc/cartridge/load.cpp:498-503"
|
source_ref: "sfc/cartridge/load.cpp:498-503"
|
||||||
|
|
||||||
- name: "dsp3.program.rom"
|
- name: "dsp3.program.rom"
|
||||||
size: 6144 # 0x1800
|
system: nintendo-snes
|
||||||
|
size: 6144
|
||||||
|
validation: [size]
|
||||||
required: true
|
required: true
|
||||||
note: "NEC uPD7725 program ROM for DSP3 (SD Gundam GX). No HLE fallback"
|
note: "NEC uPD7725 program ROM for DSP3 (SD Gundam GX). No HLE fallback"
|
||||||
source_ref: "sfc/cartridge/load.cpp:531-534"
|
source_ref: "sfc/cartridge/load.cpp:531-534"
|
||||||
|
|
||||||
- name: "dsp3.data.rom"
|
- name: "dsp3.data.rom"
|
||||||
size: 2048 # 0x800
|
system: nintendo-snes
|
||||||
|
size: 2048
|
||||||
|
validation: [size]
|
||||||
required: true
|
required: true
|
||||||
note: "NEC uPD7725 data ROM for DSP3. No HLE fallback"
|
note: "NEC uPD7725 data ROM for DSP3. No HLE fallback"
|
||||||
source_ref: "sfc/cartridge/load.cpp:531-534"
|
source_ref: "sfc/cartridge/load.cpp:531-534"
|
||||||
|
|
||||||
- name: "dsp4.program.rom"
|
- name: "dsp4.program.rom"
|
||||||
size: 6144 # 0x1800
|
system: nintendo-snes
|
||||||
|
size: 6144
|
||||||
|
validation: [size]
|
||||||
required: false
|
required: false
|
||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
note: "NEC uPD7725 program ROM for DSP4 (Top Gear 3000). HLE fallback available"
|
note: "NEC uPD7725 program ROM for DSP4 (Top Gear 3000)"
|
||||||
source_ref: "sfc/cartridge/load.cpp:522-528, heuristics/super-famicom.cpp:604-605"
|
source_ref: "sfc/cartridge/load.cpp:522-528, heuristics/super-famicom.cpp:604-605"
|
||||||
|
|
||||||
- name: "dsp4.data.rom"
|
- name: "dsp4.data.rom"
|
||||||
size: 2048 # 0x800
|
system: nintendo-snes
|
||||||
|
size: 2048
|
||||||
|
validation: [size]
|
||||||
required: false
|
required: false
|
||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
note: "NEC uPD7725 data ROM for DSP4. HLE fallback available"
|
note: "NEC uPD7725 data ROM for DSP4"
|
||||||
source_ref: "sfc/cartridge/load.cpp:498-503"
|
source_ref: "sfc/cartridge/load.cpp:498-503"
|
||||||
|
|
||||||
# -- NEC uPD96050 coprocessor (ST010, ST011) --
|
# -- NEC uPD96050 coprocessor (ST010, ST011) --
|
||||||
@@ -101,27 +121,35 @@ files:
|
|||||||
# program ROM: 16384 x 24-bit words, data ROM: 2048 x 16-bit words
|
# program ROM: 16384 x 24-bit words, data ROM: 2048 x 16-bit words
|
||||||
|
|
||||||
- name: "st010.program.rom"
|
- name: "st010.program.rom"
|
||||||
size: 49152 # 0xC000
|
system: nintendo-snes
|
||||||
|
size: 49152
|
||||||
|
validation: [size]
|
||||||
required: false
|
required: false
|
||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
note: "NEC uPD96050 program ROM for ST010. HLE fallback available"
|
note: "NEC uPD96050 program ROM for ST010"
|
||||||
source_ref: "sfc/cartridge/load.cpp:570-574, heuristics/super-famicom.cpp:583-587"
|
source_ref: "sfc/cartridge/load.cpp:570-574, heuristics/super-famicom.cpp:583-587"
|
||||||
|
|
||||||
- name: "st010.data.rom"
|
- name: "st010.data.rom"
|
||||||
size: 4096 # 0x1000
|
system: nintendo-snes
|
||||||
|
size: 4096
|
||||||
|
validation: [size]
|
||||||
required: false
|
required: false
|
||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
note: "NEC uPD96050 data ROM for ST010. HLE fallback available"
|
note: "NEC uPD96050 data ROM for ST010"
|
||||||
source_ref: "sfc/cartridge/load.cpp:578-583"
|
source_ref: "sfc/cartridge/load.cpp:578-583"
|
||||||
|
|
||||||
- name: "st011.program.rom"
|
- name: "st011.program.rom"
|
||||||
size: 49152 # 0xC000
|
system: nintendo-snes
|
||||||
|
size: 49152
|
||||||
|
validation: [size]
|
||||||
required: true
|
required: true
|
||||||
note: "NEC uPD96050 program ROM for ST011 (2dan Morita Shougi). No HLE fallback"
|
note: "NEC uPD96050 program ROM for ST011 (2dan Morita Shougi). No HLE fallback"
|
||||||
source_ref: "sfc/cartridge/load.cpp:599-601, heuristics/super-famicom.cpp:586"
|
source_ref: "sfc/cartridge/load.cpp:599-601, heuristics/super-famicom.cpp:586"
|
||||||
|
|
||||||
- name: "st011.data.rom"
|
- name: "st011.data.rom"
|
||||||
size: 4096 # 0x1000
|
system: nintendo-snes
|
||||||
|
size: 4096
|
||||||
|
validation: [size]
|
||||||
required: true
|
required: true
|
||||||
note: "NEC uPD96050 data ROM for ST011. No HLE fallback"
|
note: "NEC uPD96050 data ROM for ST011. No HLE fallback"
|
||||||
source_ref: "sfc/cartridge/load.cpp:599-601"
|
source_ref: "sfc/cartridge/load.cpp:599-601"
|
||||||
@@ -131,13 +159,17 @@ files:
|
|||||||
# No HLE fallback exists
|
# No HLE fallback exists
|
||||||
|
|
||||||
- name: "st018.program.rom"
|
- name: "st018.program.rom"
|
||||||
size: 131072 # 0x20000 (128 KB)
|
system: nintendo-snes
|
||||||
|
size: 131072
|
||||||
|
validation: [size]
|
||||||
required: true
|
required: true
|
||||||
note: "ARM6 program ROM for ST018 (Hayazashi Nidan Morita Shougi). No HLE fallback"
|
note: "ARM6 program ROM for ST018 (Hayazashi Nidan Morita Shougi). No HLE fallback"
|
||||||
source_ref: "sfc/cartridge/load.cpp:379-385, armdsp/armdsp.hpp:31, heuristics/super-famicom.cpp:580"
|
source_ref: "sfc/cartridge/load.cpp:379-385, armdsp/armdsp.hpp:31, heuristics/super-famicom.cpp:580"
|
||||||
|
|
||||||
- name: "st018.data.rom"
|
- name: "st018.data.rom"
|
||||||
size: 32768 # 0x8000 (32 KB)
|
system: nintendo-snes
|
||||||
|
size: 32768
|
||||||
|
validation: [size]
|
||||||
required: true
|
required: true
|
||||||
note: "ARM6 data ROM for ST018. No HLE fallback"
|
note: "ARM6 data ROM for ST018. No HLE fallback"
|
||||||
source_ref: "sfc/cartridge/load.cpp:387-393, armdsp/armdsp.hpp:32"
|
source_ref: "sfc/cartridge/load.cpp:387-393, armdsp/armdsp.hpp:32"
|
||||||
@@ -148,11 +180,16 @@ files:
|
|||||||
# Built-in staticDataROM fallback also present for LLE when file missing
|
# Built-in staticDataROM fallback also present for LLE when file missing
|
||||||
|
|
||||||
- name: "cx4.data.rom"
|
- name: "cx4.data.rom"
|
||||||
size: 3072 # 0xC00
|
system: nintendo-snes
|
||||||
|
size: 3072
|
||||||
|
sha1: a002f4efba42775a31185d443f3ed1790b0e949a
|
||||||
|
md5: 037ac4296b6b6a5c47c440188d3c72e3
|
||||||
|
crc32: b6e76a6a
|
||||||
|
validation: [size]
|
||||||
required: false
|
required: false
|
||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
note: "Hitachi HG51BS169 data ROM for Cx4 (Mega Man X2/X3). HLE fallback and built-in static ROM available"
|
note: "Hitachi HG51BS169 data ROM for Cx4 (Mega Man X2/X3). HLE fallback and built-in static ROM available"
|
||||||
source_ref: "sfc/cartridge/load.cpp:444-456, hitachidsp/hitachidsp.hpp:49, heuristics/super-famicom.cpp:597"
|
source_ref: "sfc/cartridge/load.cpp:444-456, hitachidsp/hitachidsp.hpp:49, heuristics/super-famicom.cpp:597, hitachidsp/data-rom.cpp:3 (staticDataROM[3072])"
|
||||||
|
|
||||||
# -- Super Game Boy cartridge ROM --
|
# -- Super Game Boy cartridge ROM --
|
||||||
# The SGB boot ROMs (256 bytes each) are embedded in icd/boot-roms.cpp.
|
# The SGB boot ROMs (256 bytes each) are embedded in icd/boot-roms.cpp.
|
||||||
@@ -160,23 +197,26 @@ files:
|
|||||||
# Core option bsnes_sgb_bios selects between SGB1.sfc and SGB2.sfc.
|
# Core option bsnes_sgb_bios selects between SGB1.sfc and SGB2.sfc.
|
||||||
|
|
||||||
- name: "SGB1.sfc"
|
- name: "SGB1.sfc"
|
||||||
|
system: nintendo-super-game-boy
|
||||||
required: false
|
required: false
|
||||||
note: "Super Game Boy 1 cartridge ROM. Needed to play Game Boy games via SGB mode"
|
note: "Super Game Boy 1 cartridge ROM, loaded when playing .gb/.gbc via SGB mode"
|
||||||
source_ref: "target-libretro/libretro.cpp:689,933, target-libretro/libretro_core_options.h:689"
|
source_ref: "target-libretro/libretro.cpp:926-935 (system_dir + sgb_bios), libretro.cpp:509 (core option bsnes_sgb_bios)"
|
||||||
|
|
||||||
- name: "SGB2.sfc"
|
- name: "SGB2.sfc"
|
||||||
|
system: nintendo-super-game-boy
|
||||||
required: false
|
required: false
|
||||||
note: "Super Game Boy 2 cartridge ROM. Uses dedicated oscillator for accurate GB speed"
|
note: "Super Game Boy 2 cartridge ROM, uses dedicated oscillator for accurate GB speed"
|
||||||
source_ref: "target-libretro/libretro.cpp:690,933, target-libretro/libretro_core_options.h:690"
|
source_ref: "target-libretro/libretro.cpp:926-935 (system_dir + sgb_bios), libretro.cpp:509 (core option bsnes_sgb_bios)"
|
||||||
|
|
||||||
# -- BS-X Satellaview BIOS --
|
# -- BS-X Satellaview BIOS --
|
||||||
# Required for loading .bs (BS Memory) format games.
|
# Required for loading .bs (BS Memory) format games.
|
||||||
# Hardcoded filename in libretro.cpp.
|
# Hardcoded filename in libretro.cpp.
|
||||||
|
|
||||||
- name: "BS-X.bin"
|
- name: "BS-X.bin"
|
||||||
|
system: nintendo-satellaview
|
||||||
required: true
|
required: true
|
||||||
note: "BS-X Satellaview BIOS ROM. Required for .bs games"
|
note: "BS-X Satellaview BIOS ROM, loaded from system_dir when running .bs games"
|
||||||
source_ref: "target-libretro/libretro.cpp:948"
|
source_ref: "target-libretro/libretro.cpp:944-951 (system_dir + BS-X.bin hardcoded, .bs extension branch)"
|
||||||
|
|
||||||
notes:
|
notes:
|
||||||
hle_available: true
|
hle_available: true
|
||||||
|
|||||||
+2
-1
@@ -35,9 +35,10 @@ files:
|
|||||||
system: nintendo-3ds
|
system: nintendo-3ds
|
||||||
description: "ARM9 bootrom"
|
description: "ARM9 bootrom"
|
||||||
required: false
|
required: false
|
||||||
|
size: 65536
|
||||||
validation: [size]
|
validation: [size]
|
||||||
source_ref: "src/core/hw/aes/key.cpp:162-172 LoadBootromKeys(), src/core/hw/rsa/rsa.cpp:55-65 InitSlots()"
|
source_ref: "src/core/hw/aes/key.cpp:162-172 LoadBootromKeys(), src/core/hw/rsa/rsa.cpp:55-65 InitSlots()"
|
||||||
note: "expected size 65536 bytes, provides AES and RSA keys"
|
note: "provides AES and RSA keys"
|
||||||
|
|
||||||
- name: shared_font.bin
|
- name: shared_font.bin
|
||||||
path: "Citra/sysdata/shared_font.bin"
|
path: "Citra/sysdata/shared_font.bin"
|
||||||
|
|||||||
+6
-3
@@ -720,7 +720,8 @@ files:
|
|||||||
# MSX (machine_name: "MSX")
|
# MSX (machine_name: "MSX")
|
||||||
# -------------------------------------------------------
|
# -------------------------------------------------------
|
||||||
- name: msx.rom
|
- name: msx.rom
|
||||||
path: MSX/msx.rom
|
aliases: [MSX.ROM]
|
||||||
|
path: MSX/MSX.ROM
|
||||||
description: "Generic MSX BIOS"
|
description: "Generic MSX BIOS"
|
||||||
size: 32768
|
size: 32768
|
||||||
crc32: "94ee12f3"
|
crc32: "94ee12f3"
|
||||||
@@ -768,7 +769,8 @@ files:
|
|||||||
source_ref: "Machines/Utility/ROMCatalogue.cpp:763-769"
|
source_ref: "Machines/Utility/ROMCatalogue.cpp:763-769"
|
||||||
|
|
||||||
- name: msx2.rom
|
- name: msx2.rom
|
||||||
path: MSX/msx2.rom
|
aliases: [MSX2.ROM]
|
||||||
|
path: MSX/MSX2.ROM
|
||||||
description: "Generic MSX2 BIOS"
|
description: "Generic MSX2 BIOS"
|
||||||
size: 32768
|
size: 32768
|
||||||
crc32: "6cdaf3a5"
|
crc32: "6cdaf3a5"
|
||||||
@@ -778,7 +780,8 @@ files:
|
|||||||
source_ref: "Machines/Utility/ROMCatalogue.cpp:771-778"
|
source_ref: "Machines/Utility/ROMCatalogue.cpp:771-778"
|
||||||
|
|
||||||
- name: msx2ext.rom
|
- name: msx2ext.rom
|
||||||
path: MSX/msx2ext.rom
|
aliases: [MSX2EXT.ROM]
|
||||||
|
path: MSX/MSX2EXT.ROM
|
||||||
description: "MSX2 extension ROM"
|
description: "MSX2 extension ROM"
|
||||||
size: 16384
|
size: 16384
|
||||||
crc32: "66237ecf"
|
crc32: "66237ecf"
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ files:
|
|||||||
|
|
||||||
- name: "cromwell_1024.bin"
|
- name: "cromwell_1024.bin"
|
||||||
path: "cromwell_1024.bin"
|
path: "cromwell_1024.bin"
|
||||||
|
size: 1048576
|
||||||
validation: [size]
|
validation: [size]
|
||||||
required: true
|
required: true
|
||||||
note: >
|
note: >
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
validation: [size]
|
validation: [size]
|
||||||
known_hash_adler32: "0x66f334fe"
|
known_hash_adler32: "0x66f334fe"
|
||||||
|
adler32_byteswap: true
|
||||||
note: "DSP instruction ROM for LLE audio. Free replacement (v0.4) included"
|
note: "DSP instruction ROM for LLE audio. Free replacement (v0.4) included"
|
||||||
source_ref: "Source/Core/Common/CommonPaths.h:136, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:84-117"
|
source_ref: "Source/Core/Common/CommonPaths.h:136, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:84-117"
|
||||||
|
|
||||||
@@ -75,6 +76,7 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
validation: [size]
|
validation: [size]
|
||||||
known_hash_adler32: "0xf3b93527"
|
known_hash_adler32: "0xf3b93527"
|
||||||
|
adler32_byteswap: true
|
||||||
note: "DSP coefficient ROM for LLE audio and HLE polyphase resampling. Free replacement included"
|
note: "DSP coefficient ROM for LLE audio and HLE polyphase resampling. Free replacement included"
|
||||||
source_ref: "Source/Core/Common/CommonPaths.h:137, Source/Core/Core/DSP/DSPCore.cpp:32-33, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:55-62"
|
source_ref: "Source/Core/Common/CommonPaths.h:137, Source/Core/Core/DSP/DSPCore.cpp:32-33, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:55-62"
|
||||||
|
|
||||||
|
|||||||
@@ -238,6 +238,7 @@ files:
|
|||||||
- name: CARTS.CRC
|
- name: CARTS.CRC
|
||||||
required: false
|
required: false
|
||||||
bundled: 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)."
|
note: "CRC database for cartridge identification and mapper detection. Tried first, before CARTS.SHA (fMSX/MSX.c:2697)."
|
||||||
|
|
||||||
- name: CARTS.SHA
|
- name: CARTS.SHA
|
||||||
|
|||||||
+16
-16
@@ -244,7 +244,7 @@ files:
|
|||||||
- name: "fuse/128p-0.rom"
|
- name: "fuse/128p-0.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: true
|
required: true
|
||||||
md5: ""
|
|
||||||
size: 16384
|
size: 16384
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Pentagon 128K/512K/1024 ROM 0. Required for Pentagon machines."
|
note: "Pentagon 128K/512K/1024 ROM 0. Required for Pentagon machines."
|
||||||
@@ -253,7 +253,7 @@ files:
|
|||||||
- name: "fuse/128p-1.rom"
|
- name: "fuse/128p-1.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: true
|
required: true
|
||||||
md5: ""
|
|
||||||
size: 16384
|
size: 16384
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Pentagon 128K/512K/1024 ROM 1. Required for Pentagon machines."
|
note: "Pentagon 128K/512K/1024 ROM 1. Required for Pentagon machines."
|
||||||
@@ -262,7 +262,7 @@ files:
|
|||||||
- name: "fuse/trdos.rom"
|
- name: "fuse/trdos.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: true
|
required: true
|
||||||
md5: ""
|
|
||||||
size: 16384
|
size: 16384
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "TR-DOS ROM (Beta 128 disk interface). Used by Pentagon and Scorpion."
|
note: "TR-DOS ROM (Beta 128 disk interface). Used by Pentagon and Scorpion."
|
||||||
@@ -271,7 +271,7 @@ files:
|
|||||||
- name: "fuse/gluck.rom"
|
- name: "fuse/gluck.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: true
|
required: true
|
||||||
md5: ""
|
|
||||||
size: 16384
|
size: 16384
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Gluck ROM. Required for Pentagon 512K and 1024."
|
note: "Gluck ROM. Required for Pentagon 512K and 1024."
|
||||||
@@ -281,7 +281,7 @@ files:
|
|||||||
- name: "fuse/256s-0.rom"
|
- name: "fuse/256s-0.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: true
|
required: true
|
||||||
md5: ""
|
|
||||||
size: 16384
|
size: 16384
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Scorpion 256K ROM 0. Required for Scorpion machine."
|
note: "Scorpion 256K ROM 0. Required for Scorpion machine."
|
||||||
@@ -290,7 +290,7 @@ files:
|
|||||||
- name: "fuse/256s-1.rom"
|
- name: "fuse/256s-1.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: true
|
required: true
|
||||||
md5: ""
|
|
||||||
size: 16384
|
size: 16384
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Scorpion 256K ROM 1. Required for Scorpion machine."
|
note: "Scorpion 256K ROM 1. Required for Scorpion machine."
|
||||||
@@ -299,7 +299,7 @@ files:
|
|||||||
- name: "fuse/256s-2.rom"
|
- name: "fuse/256s-2.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: true
|
required: true
|
||||||
md5: ""
|
|
||||||
size: 16384
|
size: 16384
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Scorpion 256K ROM 2. Required for Scorpion machine."
|
note: "Scorpion 256K ROM 2. Required for Scorpion machine."
|
||||||
@@ -308,7 +308,7 @@ files:
|
|||||||
- name: "fuse/256s-3.rom"
|
- name: "fuse/256s-3.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: true
|
required: true
|
||||||
md5: ""
|
|
||||||
size: 16384
|
size: 16384
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Scorpion 256K ROM 3 (TR-DOS). Required for Scorpion machine."
|
note: "Scorpion 256K ROM 3 (TR-DOS). Required for Scorpion machine."
|
||||||
@@ -318,7 +318,7 @@ files:
|
|||||||
- name: "fuse/if1-2.rom"
|
- name: "fuse/if1-2.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: false
|
required: false
|
||||||
md5: ""
|
|
||||||
size: 8192
|
size: 8192
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Interface 1 ROM (edition 2). Loaded by peripherals/if1.c:403."
|
note: "Interface 1 ROM (edition 2). Loaded by peripherals/if1.c:403."
|
||||||
@@ -347,7 +347,7 @@ files:
|
|||||||
- name: "fuse/didaktik80.rom"
|
- name: "fuse/didaktik80.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: false
|
required: false
|
||||||
md5: ""
|
|
||||||
size: 14336
|
size: 14336
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Didaktik 80 disk interface ROM. Not embedded."
|
note: "Didaktik 80 disk interface ROM. Not embedded."
|
||||||
@@ -356,7 +356,7 @@ files:
|
|||||||
- name: "fuse/opus.rom"
|
- name: "fuse/opus.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: false
|
required: false
|
||||||
md5: ""
|
|
||||||
size: 8192
|
size: 8192
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Opus Discovery disk interface ROM. Not embedded."
|
note: "Opus Discovery disk interface ROM. Not embedded."
|
||||||
@@ -365,7 +365,7 @@ files:
|
|||||||
- name: "fuse/mf1.rom"
|
- name: "fuse/mf1.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: false
|
required: false
|
||||||
md5: ""
|
|
||||||
size: 8192
|
size: 8192
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Multiface 1 ROM. Not embedded."
|
note: "Multiface 1 ROM. Not embedded."
|
||||||
@@ -374,7 +374,7 @@ files:
|
|||||||
- name: "fuse/mf128.rom"
|
- name: "fuse/mf128.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: false
|
required: false
|
||||||
md5: ""
|
|
||||||
size: 8192
|
size: 8192
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Multiface 128 ROM. Not embedded."
|
note: "Multiface 128 ROM. Not embedded."
|
||||||
@@ -383,7 +383,7 @@ files:
|
|||||||
- name: "fuse/mf3.rom"
|
- name: "fuse/mf3.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: false
|
required: false
|
||||||
md5: ""
|
|
||||||
size: 8192
|
size: 8192
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Multiface 3 ROM. Not embedded."
|
note: "Multiface 3 ROM. Not embedded."
|
||||||
@@ -402,7 +402,7 @@ files:
|
|||||||
- name: "fuse/ttx2000s.rom"
|
- name: "fuse/ttx2000s.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: false
|
required: false
|
||||||
md5: ""
|
|
||||||
size: 8192
|
size: 8192
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "TTX2000S teletext adapter ROM. Not embedded."
|
note: "TTX2000S teletext adapter ROM. Not embedded."
|
||||||
@@ -411,7 +411,7 @@ files:
|
|||||||
- name: "fuse/usource.rom"
|
- name: "fuse/usource.rom"
|
||||||
system: sinclair-zxspectrum
|
system: sinclair-zxspectrum
|
||||||
required: false
|
required: false
|
||||||
md5: ""
|
|
||||||
size: 8192
|
size: 8192
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Currah uSource ROM. Not embedded."
|
note: "Currah uSource ROM. Not embedded."
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
validation: [size]
|
validation: [size]
|
||||||
known_hash_adler32: "0x66f334fe"
|
known_hash_adler32: "0x66f334fe"
|
||||||
|
adler32_byteswap: true
|
||||||
note: "DSP instruction ROM for LLE audio. Free replacement included"
|
note: "DSP instruction ROM for LLE audio. Free replacement included"
|
||||||
source_ref: "Source/Core/Common/CommonPaths.h:112, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:142-150, Source/Core/Core/DSP/DSPCore.cpp:48,67"
|
source_ref: "Source/Core/Common/CommonPaths.h:112, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:142-150, Source/Core/Core/DSP/DSPCore.cpp:48,67"
|
||||||
|
|
||||||
@@ -72,6 +73,7 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
validation: [size]
|
validation: [size]
|
||||||
known_hash_adler32: "0xf3b93527"
|
known_hash_adler32: "0xf3b93527"
|
||||||
|
adler32_byteswap: true
|
||||||
note: "DSP coefficient ROM for LLE audio and HLE polyphase resampling. Free replacement included"
|
note: "DSP coefficient ROM for LLE audio and HLE polyphase resampling. Free replacement included"
|
||||||
source_ref: "Source/Core/Common/CommonPaths.h:113, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:143-153, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:43-72, Source/Core/Core/DSP/DSPCore.cpp:48,68"
|
source_ref: "Source/Core/Common/CommonPaths.h:113, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:143-153, Source/Core/Core/HW/DSPHLE/UCodes/AX.cpp:43-72, Source/Core/Core/DSP/DSPCore.cpp:48,68"
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
size: 4096
|
size: 4096
|
||||||
validation: {core: [size], upstream: [size, crc32]}
|
validation: {core: [size], upstream: [size, crc32]}
|
||||||
crc32: "0x2ab23573"
|
crc32: 2ab23573
|
||||||
source_ref: "src/NDS.h:196, src/NDS.cpp:467-477, src/frontend/Util_ROM.cpp:99-111"
|
source_ref: "src/NDS.h:196, src/NDS.cpp:467-477, src/frontend/Util_ROM.cpp:99-111"
|
||||||
note: "FreeBIOS fallback (src/FreeBIOS.h); native needed for Key1 cartridge crypto"
|
note: "FreeBIOS fallback (src/FreeBIOS.h); native needed for Key1 cartridge crypto"
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
size: 16384
|
size: 16384
|
||||||
validation: {core: [size], upstream: [size, crc32]}
|
validation: {core: [size], upstream: [size, crc32]}
|
||||||
crc32: "0x1280f0d5"
|
crc32: 1280f0d5
|
||||||
source_ref: "src/NDS.h:197, src/NDS.cpp:482-492, src/frontend/Util_ROM.cpp:117-131"
|
source_ref: "src/NDS.h:197, src/NDS.cpp:482-492, src/frontend/Util_ROM.cpp:117-131"
|
||||||
note: "FreeBIOS fallback (src/FreeBIOS.h); native needed for Key1 init at offset 0x0030"
|
note: "FreeBIOS fallback (src/FreeBIOS.h); native needed for Key1 init at offset 0x0030"
|
||||||
|
|
||||||
@@ -44,6 +44,8 @@ files:
|
|||||||
description: "NDS firmware image"
|
description: "NDS firmware image"
|
||||||
required: false
|
required: false
|
||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
|
min_size: 262144
|
||||||
|
max_size: 524288
|
||||||
validation: [size]
|
validation: [size]
|
||||||
source_ref: "src/SPI.cpp:192-211, src/frontend/Util_ROM.cpp:174-195"
|
source_ref: "src/SPI.cpp:192-211, src/frontend/Util_ROM.cpp:174-195"
|
||||||
note: "Generated 128KB firmware as fallback; native must be 256KB or 512KB for boot"
|
note: "Generated 128KB firmware as fallback; native must be 256KB or 512KB for boot"
|
||||||
@@ -55,7 +57,7 @@ files:
|
|||||||
required: true
|
required: true
|
||||||
size: 65536
|
size: 65536
|
||||||
validation: {core: [size], upstream: [size, crc32]}
|
validation: {core: [size], upstream: [size, crc32]}
|
||||||
crc32: "0xBAE84F6C"
|
crc32: bae84f6c
|
||||||
source_ref: "src/DSi.h:33, src/DSi.cpp:587-599, src/frontend/Util_ROM.cpp:145-156"
|
source_ref: "src/DSi.h:33, src/DSi.cpp:587-599, src/frontend/Util_ROM.cpp:145-156"
|
||||||
|
|
||||||
- name: dsi_bios7.bin
|
- name: dsi_bios7.bin
|
||||||
@@ -64,7 +66,7 @@ files:
|
|||||||
required: true
|
required: true
|
||||||
size: 65536
|
size: 65536
|
||||||
validation: {core: [size], upstream: [size, crc32]}
|
validation: {core: [size], upstream: [size, crc32]}
|
||||||
crc32: "0x4316CC42"
|
crc32: 4316cc42
|
||||||
source_ref: "src/DSi.h:34, src/DSi.cpp:604-620, src/frontend/Util_ROM.cpp:158-170"
|
source_ref: "src/DSi.h:34, src/DSi.cpp:604-620, src/frontend/Util_ROM.cpp:158-170"
|
||||||
note: "Contains eMMC key-Y at offset 0x8308 for NAND init"
|
note: "Contains eMMC key-Y at offset 0x8308 for NAND init"
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
size: 16384
|
size: 16384
|
||||||
validation: [size]
|
validation: [size]
|
||||||
crc32: "0x1280f0d5"
|
crc32: 1280f0d5
|
||||||
source_ref: "src/libretro/config/console.cpp:219, melonDS:src/MemConstants.h:31,36"
|
source_ref: "src/libretro/config/console.cpp:219, melonDS:src/MemConstants.h:31,36"
|
||||||
|
|
||||||
- name: bios9.bin
|
- name: bios9.bin
|
||||||
@@ -37,7 +37,7 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
size: 4096
|
size: 4096
|
||||||
validation: [size]
|
validation: [size]
|
||||||
crc32: "0x2ab23573"
|
crc32: 2ab23573
|
||||||
source_ref: "src/libretro/config/console.cpp:220, melonDS:src/MemConstants.h:30,37"
|
source_ref: "src/libretro/config/console.cpp:220, melonDS:src/MemConstants.h:30,37"
|
||||||
|
|
||||||
- name: firmware.bin
|
- name: firmware.bin
|
||||||
@@ -55,7 +55,7 @@ files:
|
|||||||
required: true
|
required: true
|
||||||
size: 65536
|
size: 65536
|
||||||
validation: [size]
|
validation: [size]
|
||||||
crc32: "0x4316CC42"
|
crc32: 4316cc42
|
||||||
source_ref: "src/libretro/config/console.cpp:333, melonDS:src/MemConstants.h:32,44"
|
source_ref: "src/libretro/config/console.cpp:333, melonDS:src/MemConstants.h:32,44"
|
||||||
note: "Contains eMMC key-Y at offset 0x8308 for NAND init"
|
note: "Contains eMMC key-Y at offset 0x8308 for NAND init"
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ files:
|
|||||||
required: true
|
required: true
|
||||||
size: 65536
|
size: 65536
|
||||||
validation: [size]
|
validation: [size]
|
||||||
crc32: "0xBAE84F6C"
|
crc32: bae84f6c
|
||||||
source_ref: "src/libretro/config/console.cpp:338, melonDS:src/MemConstants.h:32,45"
|
source_ref: "src/libretro/config/console.cpp:338, melonDS:src/MemConstants.h:32,45"
|
||||||
|
|
||||||
- name: dsi_firmware.bin
|
- name: dsi_firmware.bin
|
||||||
|
|||||||
+3
-1
@@ -65,5 +65,7 @@ files:
|
|||||||
description: "External NES color palette"
|
description: "External NES color palette"
|
||||||
required: false
|
required: false
|
||||||
source_ref: "Libretro/libretro.cpp:301-323 (load_custom_palette), Libretro/libretro.cpp:405-406 (called when mesen_palette == Custom)"
|
source_ref: "Libretro/libretro.cpp:301-323 (load_custom_palette), Libretro/libretro.cpp:405-406 (called when mesen_palette == Custom)"
|
||||||
|
min_size: 192
|
||||||
|
max_size: 1536
|
||||||
validation: [size]
|
validation: [size]
|
||||||
note: "Loaded when mesen_palette core option is Custom. Accepts exactly 192 bytes (64 RGB triplets) or 1536 bytes (512 entries for emphasis combos). Falls back to built-in default palette if size doesn't match."
|
note: "Accepts 192 bytes (64 RGB triplets) or 1536 bytes (512 emphasis combos). Falls back to built-in default if size doesn't match."
|
||||||
|
|||||||
@@ -186,6 +186,7 @@ files:
|
|||||||
path: "np2kai/gpib.rom"
|
path: "np2kai/gpib.rom"
|
||||||
size: 8192
|
size: 8192
|
||||||
required: false
|
required: false
|
||||||
|
unsourceable: "never publicly dumped, GP-IB emulation is stub code (source comment: not implemented)"
|
||||||
note: >
|
note: >
|
||||||
GP-IB interface BIOS ROM (8 KB). If missing, GP-IB emulation
|
GP-IB interface BIOS ROM (8 KB). If missing, GP-IB emulation
|
||||||
is disabled entirely.
|
is disabled entirely.
|
||||||
@@ -198,6 +199,8 @@ files:
|
|||||||
- name: "key.txt"
|
- name: "key.txt"
|
||||||
path: "np2kai/key.txt"
|
path: "np2kai/key.txt"
|
||||||
required: false
|
required: false
|
||||||
|
hle_fallback: true
|
||||||
|
unsourceable: "user-created keyboard config, no default distributed in any NP2kai release"
|
||||||
note: >
|
note: >
|
||||||
Keyboard remapping configuration (text file). User-created file
|
Keyboard remapping configuration (text file). User-created file
|
||||||
for custom keyboard layout. The core uses built-in defaults if absent.
|
for custom keyboard layout. The core uses built-in defaults if absent.
|
||||||
|
|||||||
@@ -81,5 +81,6 @@ files:
|
|||||||
system: cave-story
|
system: cave-story
|
||||||
description: "Tile attribute lookup table (maps tile codes to collision/behavior attributes)"
|
description: "Tile attribute lookup table (maps tile codes to collision/behavior attributes)"
|
||||||
required: false
|
required: false
|
||||||
|
hle_fallback: true
|
||||||
source_ref: "map.cpp:290-303 (loaded at init, hardcoded default if missing)"
|
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."
|
note: "Not part of the freeware distribution. Generated by the standalone NXEngine extraction tool. The libretro core has hardcoded defaults in map.cpp:30."
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
validation: [size]
|
validation: [size]
|
||||||
known_hash_adler32: "0x66f334fe"
|
known_hash_adler32: "0x66f334fe"
|
||||||
|
adler32_byteswap: true
|
||||||
note: "DSP instruction ROM for LLE audio. Free replacement (v0.4) included"
|
note: "DSP instruction ROM for LLE audio. Free replacement (v0.4) included"
|
||||||
source_ref: "Source/Core/Common/CommonPaths.h:135, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-117"
|
source_ref: "Source/Core/Common/CommonPaths.h:135, Source/Core/Core/HW/DSPLLE/DSPLLE.cpp:87-117"
|
||||||
|
|
||||||
@@ -79,6 +80,7 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
validation: [size]
|
validation: [size]
|
||||||
known_hash_adler32: "0xf3b93527"
|
known_hash_adler32: "0xf3b93527"
|
||||||
|
adler32_byteswap: true
|
||||||
note: "DSP coefficient ROM for LLE audio. Free replacement included"
|
note: "DSP coefficient ROM for LLE audio. Free replacement included"
|
||||||
source_ref: "Source/Core/Common/CommonPaths.h:136, Source/Core/Core/DSP/DSPCore.cpp:32-38"
|
source_ref: "Source/Core/Common/CommonPaths.h:136, Source/Core/Core/DSP/DSPCore.cpp:32-38"
|
||||||
|
|
||||||
|
|||||||
@@ -247,6 +247,7 @@ files:
|
|||||||
- name: "WHDLoad.key"
|
- name: "WHDLoad.key"
|
||||||
system: commodore-amiga
|
system: commodore-amiga
|
||||||
required: false
|
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."
|
note: "WHDLoad license key. Copied to saves/WHDLoad/L/ for registered WHDLoad use."
|
||||||
source_ref: "libretro/libretro-core.c:5985-5998"
|
source_ref: "libretro/libretro-core.c:5985-5998"
|
||||||
|
|
||||||
|
|||||||
@@ -251,6 +251,7 @@ files:
|
|||||||
- name: "WHDLoad.key"
|
- name: "WHDLoad.key"
|
||||||
system: commodore-amiga
|
system: commodore-amiga
|
||||||
required: false
|
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."
|
note: "WHDLoad license key. Copied to saves/WHDLoad/L/ for registered WHDLoad use."
|
||||||
source_ref: "libretro/libretro-core.c:5903-5916"
|
source_ref: "libretro/libretro-core.c:5903-5916"
|
||||||
|
|
||||||
|
|||||||
+8
-8
@@ -533,7 +533,7 @@ files:
|
|||||||
|
|
||||||
- name: "U-Boot LEON3"
|
- name: "U-Boot LEON3"
|
||||||
path: "qemu/u-boot.bin"
|
path: "qemu/u-boot.bin"
|
||||||
sha1: ""
|
|
||||||
required: false
|
required: false
|
||||||
note: "U-Boot for LEON3 SPARC board. Not shipped with QEMU, user-supplied."
|
note: "U-Boot for LEON3 SPARC board. Not shipped with QEMU, user-supplied."
|
||||||
source_ref: "hw/sparc/leon3.c:53"
|
source_ref: "hw/sparc/leon3.c:53"
|
||||||
@@ -611,28 +611,28 @@ files:
|
|||||||
# ========================================================
|
# ========================================================
|
||||||
- name: "MIPS BIOS (big-endian)"
|
- name: "MIPS BIOS (big-endian)"
|
||||||
path: "qemu/mips_bios.bin"
|
path: "qemu/mips_bios.bin"
|
||||||
sha1: ""
|
|
||||||
required: false
|
required: false
|
||||||
note: "Default BIOS for big-endian MIPS machines (Malta, MIPSsim, Jazz). Not shipped with QEMU."
|
note: "Default BIOS for big-endian MIPS machines (Malta, MIPSsim, Jazz). Not shipped with QEMU."
|
||||||
source_ref: "hw/mips/malta.c:97"
|
source_ref: "hw/mips/malta.c:97"
|
||||||
|
|
||||||
- name: "MIPS BIOS (little-endian)"
|
- name: "MIPS BIOS (little-endian)"
|
||||||
path: "qemu/mipsel_bios.bin"
|
path: "qemu/mipsel_bios.bin"
|
||||||
sha1: ""
|
|
||||||
required: false
|
required: false
|
||||||
note: "Default BIOS for little-endian MIPS machines (Malta, MIPSsim, Jazz). Not shipped with QEMU."
|
note: "Default BIOS for little-endian MIPS machines (Malta, MIPSsim, Jazz). Not shipped with QEMU."
|
||||||
source_ref: "hw/mips/malta.c:99"
|
source_ref: "hw/mips/malta.c:99"
|
||||||
|
|
||||||
- name: "Loongson3 BIOS"
|
- name: "Loongson3 BIOS"
|
||||||
path: "qemu/bios_loongson3.bin"
|
path: "qemu/bios_loongson3.bin"
|
||||||
sha1: ""
|
|
||||||
required: false
|
required: false
|
||||||
note: "Default BIOS for Loongson3 virtual MIPS machine. Not shipped with QEMU."
|
note: "Default BIOS for Loongson3 virtual MIPS machine. Not shipped with QEMU."
|
||||||
source_ref: "hw/mips/loongson3_virt.c:63"
|
source_ref: "hw/mips/loongson3_virt.c:63"
|
||||||
|
|
||||||
- name: "PMON Fuloong2e"
|
- name: "PMON Fuloong2e"
|
||||||
path: "qemu/pmon_2e.bin"
|
path: "qemu/pmon_2e.bin"
|
||||||
sha1: ""
|
|
||||||
required: false
|
required: false
|
||||||
note: "PMON monitor for Fuloong2e MIPS board. Not shipped with QEMU."
|
note: "PMON monitor for Fuloong2e MIPS board. Not shipped with QEMU."
|
||||||
source_ref: "hw/mips/fuloong2e.c:58"
|
source_ref: "hw/mips/fuloong2e.c:58"
|
||||||
@@ -642,7 +642,7 @@ files:
|
|||||||
# ========================================================
|
# ========================================================
|
||||||
- name: "Macintosh ROM"
|
- name: "Macintosh ROM"
|
||||||
path: "qemu/MacROM.bin"
|
path: "qemu/MacROM.bin"
|
||||||
sha1: ""
|
|
||||||
required: false
|
required: false
|
||||||
note: "Apple Macintosh ROM for Quadra 800 emulation. Not shipped with QEMU."
|
note: "Apple Macintosh ROM for Quadra 800 emulation. Not shipped with QEMU."
|
||||||
source_ref: "hw/m68k/q800.c:62"
|
source_ref: "hw/m68k/q800.c:62"
|
||||||
@@ -652,7 +652,7 @@ files:
|
|||||||
# ========================================================
|
# ========================================================
|
||||||
- name: "Canon A1100 ROM"
|
- name: "Canon A1100 ROM"
|
||||||
path: "qemu/canon-a1100-rom1.bin"
|
path: "qemu/canon-a1100-rom1.bin"
|
||||||
sha1: ""
|
|
||||||
required: false
|
required: false
|
||||||
note: "Canon PowerShot A1100 IS DIGIC camera ROM. Not shipped with QEMU."
|
note: "Canon PowerShot A1100 IS DIGIC camera ROM. Not shipped with QEMU."
|
||||||
source_ref: "hw/arm/digic_boards.c:131"
|
source_ref: "hw/arm/digic_boards.c:131"
|
||||||
@@ -702,7 +702,7 @@ files:
|
|||||||
|
|
||||||
- name: "Virtex ML507 DTB (PPC)"
|
- name: "Virtex ML507 DTB (PPC)"
|
||||||
path: "qemu/virtex-ml507.dtb"
|
path: "qemu/virtex-ml507.dtb"
|
||||||
sha1: ""
|
|
||||||
required: false
|
required: false
|
||||||
note: "Device tree blob for Xilinx Virtex ML507 PowerPC board. Not shipped with QEMU."
|
note: "Device tree blob for Xilinx Virtex ML507 PowerPC board. Not shipped with QEMU."
|
||||||
source_ref: "hw/ppc/virtex_ml507.c:148"
|
source_ref: "hw/ppc/virtex_ml507.c:148"
|
||||||
|
|||||||
@@ -24,36 +24,43 @@ notes: |
|
|||||||
|
|
||||||
files:
|
files:
|
||||||
- name: kvs1.wav
|
- name: kvs1.wav
|
||||||
|
aliases: [KVS1.WAV]
|
||||||
description: "KidVid Voice Module audio tape 1 (Smurfs Save the Day)"
|
description: "KidVid Voice Module audio tape 1 (Smurfs Save the Day)"
|
||||||
required: false
|
required: false
|
||||||
category: game_data
|
category: game_data
|
||||||
source_ref: "stella/src/emucore/KidVid.cxx:167,182"
|
source_ref: "stella/src/emucore/KidVid.cxx:167,182"
|
||||||
- name: kvs2.wav
|
- name: kvs2.wav
|
||||||
|
aliases: [KVS2.WAV]
|
||||||
description: "KidVid Voice Module audio tape 2 (Smurfs Save the Day)"
|
description: "KidVid Voice Module audio tape 2 (Smurfs Save the Day)"
|
||||||
required: false
|
required: false
|
||||||
category: game_data
|
category: game_data
|
||||||
source_ref: "stella/src/emucore/KidVid.cxx:167,182"
|
source_ref: "stella/src/emucore/KidVid.cxx:167,182"
|
||||||
- name: kvs3.wav
|
- name: kvs3.wav
|
||||||
|
aliases: [KVS3.WAV]
|
||||||
description: "KidVid Voice Module audio tape 3 (Smurfs Save the Day)"
|
description: "KidVid Voice Module audio tape 3 (Smurfs Save the Day)"
|
||||||
required: false
|
required: false
|
||||||
category: game_data
|
category: game_data
|
||||||
source_ref: "stella/src/emucore/KidVid.cxx:167,182"
|
source_ref: "stella/src/emucore/KidVid.cxx:167,182"
|
||||||
- name: kvb1.wav
|
- name: kvb1.wav
|
||||||
|
aliases: [KVB1.WAV]
|
||||||
description: "KidVid Voice Module audio tape 1 (Berenstain Bears)"
|
description: "KidVid Voice Module audio tape 1 (Berenstain Bears)"
|
||||||
required: false
|
required: false
|
||||||
category: game_data
|
category: game_data
|
||||||
source_ref: "stella/src/emucore/KidVid.cxx:167,182"
|
source_ref: "stella/src/emucore/KidVid.cxx:167,182"
|
||||||
- name: kvb2.wav
|
- name: kvb2.wav
|
||||||
|
aliases: [KVB2.WAV]
|
||||||
description: "KidVid Voice Module audio tape 2 (Berenstain Bears)"
|
description: "KidVid Voice Module audio tape 2 (Berenstain Bears)"
|
||||||
required: false
|
required: false
|
||||||
category: game_data
|
category: game_data
|
||||||
source_ref: "stella/src/emucore/KidVid.cxx:167,182"
|
source_ref: "stella/src/emucore/KidVid.cxx:167,182"
|
||||||
- name: kvb3.wav
|
- name: kvb3.wav
|
||||||
|
aliases: [KVB3.WAV]
|
||||||
description: "KidVid Voice Module audio tape 3 (Berenstain Bears)"
|
description: "KidVid Voice Module audio tape 3 (Berenstain Bears)"
|
||||||
required: false
|
required: false
|
||||||
category: game_data
|
category: game_data
|
||||||
source_ref: "stella/src/emucore/KidVid.cxx:167,182"
|
source_ref: "stella/src/emucore/KidVid.cxx:167,182"
|
||||||
- name: kvshared.wav
|
- name: kvshared.wav
|
||||||
|
aliases: [KVSHARED.WAV]
|
||||||
description: "KidVid Voice Module shared audio samples"
|
description: "KidVid Voice Module shared audio samples"
|
||||||
required: false
|
required: false
|
||||||
category: game_data
|
category: game_data
|
||||||
|
|||||||
@@ -70,11 +70,12 @@ files:
|
|||||||
aliases: []
|
aliases: []
|
||||||
|
|
||||||
- name: "ps1_rom.bin"
|
- name: "ps1_rom.bin"
|
||||||
description: "PS3 (v5.0 06-23-03 A)"
|
description: "PS3 embedded PS1 BIOS (v5.0 06-23-03 A)"
|
||||||
region: "Auto"
|
region: "Auto"
|
||||||
required: false
|
required: false
|
||||||
md5: "81bbe60ba7a3d1cea1d48c14cbcc647b"
|
md5: "81bbe60ba7a3d1cea1d48c14cbcc647b"
|
||||||
size: 4089584
|
size: [524288, 4194304, 4089584]
|
||||||
validation: [size, md5]
|
validation: [size, md5]
|
||||||
source_ref: "src/core/bios.cpp:70"
|
note: "Accepts PS1 (512KB), PS2 (4MB), and PS3 (0x3E66F0) sizes. Only first 512KB used."
|
||||||
|
source_ref: "src/core/bios.h:9, src/core/bios.cpp:70,83"
|
||||||
aliases: []
|
aliases: []
|
||||||
|
|||||||
@@ -86,6 +86,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 79015323128650c742a3694c9429aa91f355905e
|
||||||
|
md5: 57af4ae21d4b705c2991d98ed5c1f7b8
|
||||||
|
crc32: f833d117
|
||||||
note: "C64 BASIC V2 ROM. Embedded in core."
|
note: "C64 BASIC V2 ROM. Embedded in core."
|
||||||
source_ref: "vice/src/c64/c64rom.h:31"
|
source_ref: "vice/src/c64/c64rom.h:31"
|
||||||
|
|
||||||
@@ -95,6 +98,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 1d503e56df85a62fee696e7618dc5b4e781df1bb
|
||||||
|
md5: 39065497630802346bce17963f13c092
|
||||||
|
crc32: dbe3e7c7
|
||||||
note: "C64 Kernal Rev 3 (default). Embedded in core."
|
note: "C64 Kernal Rev 3 (default). Embedded in core."
|
||||||
source_ref: "vice/src/c64/c64rom.h:52"
|
source_ref: "vice/src/c64/c64rom.h:52"
|
||||||
|
|
||||||
@@ -104,6 +110,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 87cc04d61fc748b82df09856847bb5c2754a2033
|
||||||
|
md5: 1ae0ea224f2b291dafa2c20b990bb7d4
|
||||||
|
crc32: dce782fa
|
||||||
note: "C64 Kernal Rev 1. Embedded in core."
|
note: "C64 Kernal Rev 1. Embedded in core."
|
||||||
source_ref: "vice/src/c64/c64rom.h:50"
|
source_ref: "vice/src/c64/c64rom.h:50"
|
||||||
|
|
||||||
@@ -113,6 +122,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 0e2e4ee3f2d41f00bed72f9ab588b83e306fdb13
|
||||||
|
md5: 7360b296d64e18b88f6cf52289fd99a1
|
||||||
|
crc32: a5c687b3
|
||||||
note: "C64 Kernal Rev 2. Embedded in core."
|
note: "C64 Kernal Rev 2. Embedded in core."
|
||||||
source_ref: "vice/src/c64/c64rom.h:51"
|
source_ref: "vice/src/c64/c64rom.h:51"
|
||||||
|
|
||||||
@@ -122,6 +134,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 3ad6cc1837c679a11f551ad1cf1a32dd84ace719
|
||||||
|
md5: ddee89b0fed19572da5245ea68ff11b5
|
||||||
|
crc32: 505365d4
|
||||||
note: "C64 GS (Games System) Kernal. Embedded in core."
|
note: "C64 GS (Games System) Kernal. Embedded in core."
|
||||||
source_ref: "vice/src/c64/c64rom.h:53"
|
source_ref: "vice/src/c64/c64rom.h:53"
|
||||||
|
|
||||||
@@ -131,6 +146,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: aa136e91ecf3c5ac64f696b3dbcbfc5ba0871c98
|
||||||
|
md5: 187b8c713b51931e070872bd390b472a
|
||||||
|
crc32: 2c5965d4
|
||||||
note: "SX-64 Kernal. Embedded in core."
|
note: "SX-64 Kernal. Embedded in core."
|
||||||
source_ref: "vice/src/c64/c64rom.h:54"
|
source_ref: "vice/src/c64/c64rom.h:54"
|
||||||
|
|
||||||
@@ -140,6 +158,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 6c4fa9465f6091b174df27dfe679499df447503c
|
||||||
|
md5: da92801e3a03b005b746a4dd0b639c7c
|
||||||
|
crc32: 789c8cc5
|
||||||
note: "PET64/Educator64 (4064) Kernal. Embedded in core."
|
note: "PET64/Educator64 (4064) Kernal. Embedded in core."
|
||||||
source_ref: "vice/src/c64/c64rom.h:55"
|
source_ref: "vice/src/c64/c64rom.h:55"
|
||||||
|
|
||||||
@@ -149,6 +170,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 4ff0f11e80f4b57430d8f0c3799ed0f0e0f4565d
|
||||||
|
md5: 479553fd53346ec84054f0b1c6237397
|
||||||
|
crc32: 3a9ef6f1
|
||||||
note: "C64 Japanese Kernal. Embedded in core."
|
note: "C64 Japanese Kernal. Embedded in core."
|
||||||
source_ref: "vice/src/c64/c64rom.h:49"
|
source_ref: "vice/src/c64/c64rom.h:49"
|
||||||
|
|
||||||
@@ -158,6 +182,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: adc7c31e18c7c7413d54802ef2f4193da14711aa
|
||||||
|
md5: 12a4202f5331d45af846af6c58fba946
|
||||||
|
crc32: ec4272ee
|
||||||
note: "C64 Character Generator ROM (default). Embedded in core."
|
note: "C64 Character Generator ROM (default). Embedded in core."
|
||||||
source_ref: "vice/src/c64/c64rom.h:60"
|
source_ref: "vice/src/c64/c64rom.h:60"
|
||||||
|
|
||||||
@@ -167,6 +194,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: 0fad19dbcdb12461c99657b2979dbb5c2e47b527
|
||||||
|
md5: cf32a93c0a693ed359a4f483ef6db53d
|
||||||
|
crc32: 1604f6c1
|
||||||
note: "C64 Japanese Character Generator ROM. Embedded in core."
|
note: "C64 Japanese Character Generator ROM. Embedded in core."
|
||||||
source_ref: "vice/src/c64/c64rom.h:61"
|
source_ref: "vice/src/c64/c64rom.h:61"
|
||||||
|
|
||||||
@@ -180,6 +210,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: ceb6e1a1bf7e08eb9cbc651afa29e26adccf38ab
|
||||||
|
md5: 01f6903033b90cd506cde7802ec743c3
|
||||||
|
crc32: ba456b8e
|
||||||
note: "C128 Kernal (default international). Embedded in core."
|
note: "C128 Kernal (default international). Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:103"
|
source_ref: "vice/src/c128/c128rom.h:103"
|
||||||
|
|
||||||
@@ -189,6 +222,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 3629b3fa28b6a30bcc027b647f26654929ed1b0f
|
||||||
|
md5: 9837409b6bdb7ce055409fa3eb3e9cf0
|
||||||
|
crc32: bff7550b
|
||||||
note: "C128 Kernal German. Embedded in core."
|
note: "C128 Kernal German. Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:105"
|
source_ref: "vice/src/c128/c128rom.h:105"
|
||||||
|
|
||||||
@@ -198,6 +234,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 98c34e0dec9f52d7862b56bb287d2573eb3f6364
|
||||||
|
md5: 90907477d39db1b8fe1732692278a0e9
|
||||||
|
crc32: d311dab1
|
||||||
note: "C128 Kernal Swiss. Embedded in core."
|
note: "C128 Kernal Swiss. Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:104"
|
source_ref: "vice/src/c128/c128rom.h:104"
|
||||||
|
|
||||||
@@ -207,6 +246,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 925177c99ee7e02870c32ad62a054db1327cf0c2
|
||||||
|
md5: 7852922295c103f067ba3c0f56378a95
|
||||||
|
crc32: 1cf7f729
|
||||||
note: "C128 Kernal Swedish. Embedded in core."
|
note: "C128 Kernal Swedish. Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:110"
|
source_ref: "vice/src/c128/c128rom.h:110"
|
||||||
|
|
||||||
@@ -216,6 +258,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: d08e7991a6df14a843e92daafaf6756337959ba4
|
||||||
|
md5: 0a0eb549ec08624de11cf1f249f6f3dc
|
||||||
|
crc32: d3ecea84
|
||||||
note: "C128 Kernal Finnish (unidentified part number). Embedded in core."
|
note: "C128 Kernal Finnish (unidentified part number). Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:106"
|
source_ref: "vice/src/c128/c128rom.h:106"
|
||||||
|
|
||||||
@@ -225,6 +270,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: a0680d04db3232fa9f58598e5c9f09c4fe94f601
|
||||||
|
md5: 7a7747aa70fd63402c6a95fba0bd6806
|
||||||
|
crc32: 2df282b8
|
||||||
note: "C128 Kernal French (unidentified part number). Embedded in core."
|
note: "C128 Kernal French (unidentified part number). Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:107"
|
source_ref: "vice/src/c128/c128rom.h:107"
|
||||||
|
|
||||||
@@ -234,6 +282,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 592a626eb2b5372596ac374d3505c3ce78dd040f
|
||||||
|
md5: 142c8bd5934e9d97addb6776a2f2e8b8
|
||||||
|
crc32: 74d6b084
|
||||||
note: "C128 Kernal Italian (unidentified part number). Embedded in core."
|
note: "C128 Kernal Italian (unidentified part number). Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:108"
|
source_ref: "vice/src/c128/c128rom.h:108"
|
||||||
|
|
||||||
@@ -243,6 +294,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 00fe2fd610a812121befab1e7238fa882c0f8257
|
||||||
|
md5: 498fdedaeab458931b6103d52d5a3ea1
|
||||||
|
crc32: a5406848
|
||||||
note: "C128 Kernal Norwegian (unidentified part number). Embedded in core."
|
note: "C128 Kernal Norwegian (unidentified part number). Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:109"
|
source_ref: "vice/src/c128/c128rom.h:109"
|
||||||
|
|
||||||
@@ -252,6 +306,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: d53a7884404f7d18ebd60dd3080c8f8d71067441
|
||||||
|
md5: b86ce827c9108fbc7b9e02c690e81a23
|
||||||
|
crc32: 9f9c355b
|
||||||
note: "C128 BASIC low (BASIC part). Embedded in core."
|
note: "C128 BASIC low (BASIC part). Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:115"
|
source_ref: "vice/src/c128/c128rom.h:115"
|
||||||
|
|
||||||
@@ -261,6 +318,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: c4fb4a714e48a7bf6c28659de0302183a0e0d6c0
|
||||||
|
md5: 87bb251707d0a2c915d6e0c69fdb0fed
|
||||||
|
crc32: 6e2c91a7
|
||||||
note: "C128 BASIC high (Editor part). Embedded in core."
|
note: "C128 BASIC high (Editor part). Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:116"
|
source_ref: "vice/src/c128/c128rom.h:116"
|
||||||
|
|
||||||
@@ -288,6 +348,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: b4862cac7b9319d8e912887c97fc270d4c239349
|
||||||
|
md5: 8fa940c39225d40f37ddf7082fba8b21
|
||||||
|
crc32: dd2976d2
|
||||||
note: "C128 C64-mode Kernal Norwegian. Embedded in core."
|
note: "C128 C64-mode Kernal Norwegian. Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:136"
|
source_ref: "vice/src/c128/c128rom.h:136"
|
||||||
|
|
||||||
@@ -297,6 +360,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: e4f52d9b36c030eb94524eb49f6f0774c1d02e5e
|
||||||
|
md5: 27e26dbb267c8ebf1cd47105a6ca71e7
|
||||||
|
crc32: f10c2c25
|
||||||
note: "C128 C64-mode Kernal Swedish. Embedded in core."
|
note: "C128 C64-mode Kernal Swedish. Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:137"
|
source_ref: "vice/src/c128/c128rom.h:137"
|
||||||
|
|
||||||
@@ -306,6 +372,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 29ed066d513f2d5c09ff26d9166ba23c2afb2b3f
|
||||||
|
md5: 46b3cb2140f244c0ed1150c819e7bdc4
|
||||||
|
crc32: 6aaaafe6
|
||||||
note: "C128 Character Generator (default international). Embedded in core."
|
note: "C128 Character Generator (default international). Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:92"
|
source_ref: "vice/src/c128/c128rom.h:92"
|
||||||
|
|
||||||
@@ -315,6 +384,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 638f8aff51c2ac4f99a55b12c4f8c985ef4bebd3
|
||||||
|
md5: ec9e71614010c4efb851b83bcd685e9c
|
||||||
|
crc32: fe5a2db1
|
||||||
note: "C128 Character Generator German. Embedded in core."
|
note: "C128 Character Generator German. Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:95"
|
source_ref: "vice/src/c128/c128rom.h:95"
|
||||||
|
|
||||||
@@ -324,6 +396,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 9119b27a1bf885fa4c76fff5d858c74c194dd2b8
|
||||||
|
md5: de3e110a48de76457dbc9ad320e2caa5
|
||||||
|
crc32: bad36b88
|
||||||
note: "C128 Character Generator Italian/French/Belgian. Embedded in core."
|
note: "C128 Character Generator Italian/French/Belgian. Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:93"
|
source_ref: "vice/src/c128/c128rom.h:93"
|
||||||
|
|
||||||
@@ -333,6 +408,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 70eccd8b944146f6b60f1519b830a4ee8928d4fa
|
||||||
|
md5: 5cc3635e434fdc7023d0035e965ce76f
|
||||||
|
crc32: c8def186
|
||||||
note: "C128 Character Generator Swiss. Embedded in core."
|
note: "C128 Character Generator Swiss. Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:94"
|
source_ref: "vice/src/c128/c128rom.h:94"
|
||||||
|
|
||||||
@@ -342,6 +420,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 5a87faa457979e7b6f434251a9e32f4483b337b3
|
||||||
|
md5: 7eead22a114154c809b33320c9250e26
|
||||||
|
crc32: ba95c625
|
||||||
note: "C128 Character Generator Norwegian. Embedded in core."
|
note: "C128 Character Generator Norwegian. Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:99"
|
source_ref: "vice/src/c128/c128rom.h:99"
|
||||||
|
|
||||||
@@ -351,6 +432,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: aca3f7321ee7e6152f1f0afad646ae41964de4fb
|
||||||
|
md5: 06e46af13d13aa869218275e64d48b00
|
||||||
|
crc32: 7a70d9b8
|
||||||
note: "C128 Character Generator Finnish/Swedish. Embedded in core."
|
note: "C128 Character Generator Finnish/Swedish. Embedded in core."
|
||||||
source_ref: "vice/src/c128/c128rom.h:96"
|
source_ref: "vice/src/c128/c128rom.h:96"
|
||||||
|
|
||||||
@@ -364,6 +448,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 2097152
|
size: 2097152
|
||||||
|
sha1: 72b4c8da075646cc9940e4377004c81192c7b0b1
|
||||||
|
md5: d6efbc538195f53cfc209543640cde71
|
||||||
|
crc32: 242daa5a
|
||||||
note: "C64 DTV flash ROM (2 MB). Contains kernal, basic, chargen. Embedded in core."
|
note: "C64 DTV flash ROM (2 MB). Contains kernal, basic, chargen. Embedded in core."
|
||||||
source_ref: "vice/src/c64dtv/c64dtvflash.c:59-64"
|
source_ref: "vice/src/c64dtv/c64dtvflash.c:59-64"
|
||||||
|
|
||||||
@@ -373,6 +460,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 79015323128650c742a3694c9429aa91f355905e
|
||||||
|
md5: 57af4ae21d4b705c2991d98ed5c1f7b8
|
||||||
|
crc32: f833d117
|
||||||
note: "C64 BASIC V2 ROM (DTV copy). Embedded in core."
|
note: "C64 BASIC V2 ROM (DTV copy). Embedded in core."
|
||||||
source_ref: "vice/data/C64DTV/"
|
source_ref: "vice/data/C64DTV/"
|
||||||
|
|
||||||
@@ -382,6 +472,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: adc7c31e18c7c7413d54802ef2f4193da14711aa
|
||||||
|
md5: 12a4202f5331d45af846af6c58fba946
|
||||||
|
crc32: ec4272ee
|
||||||
note: "C64 Character Generator (DTV copy). Embedded in core."
|
note: "C64 Character Generator (DTV copy). Embedded in core."
|
||||||
source_ref: "vice/data/C64DTV/"
|
source_ref: "vice/data/C64DTV/"
|
||||||
|
|
||||||
@@ -391,6 +484,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 1d503e56df85a62fee696e7618dc5b4e781df1bb
|
||||||
|
md5: 39065497630802346bce17963f13c092
|
||||||
|
crc32: dbe3e7c7
|
||||||
note: "C64 Kernal Rev 3 (DTV copy). Embedded in core."
|
note: "C64 Kernal Rev 3 (DTV copy). Embedded in core."
|
||||||
source_ref: "vice/data/C64DTV/"
|
source_ref: "vice/data/C64DTV/"
|
||||||
|
|
||||||
@@ -404,6 +500,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 587d1e90950675ab6b12d91248a3f0d640d02e8d
|
||||||
|
md5: 8b9237706f47a9b3498d8f881ef0244d
|
||||||
|
crc32: db4c43c1
|
||||||
note: "VIC-20 BASIC ROM. Embedded in core."
|
note: "VIC-20 BASIC ROM. Embedded in core."
|
||||||
source_ref: "vice/src/vic20/vic20rom.h:43"
|
source_ref: "vice/src/vic20/vic20rom.h:43"
|
||||||
|
|
||||||
@@ -413,6 +512,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: ce0137ed69f003a299f43538fa9eee27898e621e
|
||||||
|
md5: f0587624dcd7685710a8fdb35939617f
|
||||||
|
crc32: 4be07cb4
|
||||||
note: "VIC-20 Kernal PAL (default). Embedded in core."
|
note: "VIC-20 Kernal PAL (default). Embedded in core."
|
||||||
source_ref: "vice/src/vic20/vic20rom.h:53"
|
source_ref: "vice/src/vic20/vic20rom.h:53"
|
||||||
|
|
||||||
@@ -422,6 +524,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 06de7ec017a5e78bd6746d89c2ecebb646efeb19
|
||||||
|
md5: 0313e31e5f31e1f739c2377792460d67
|
||||||
|
crc32: e5e7c174
|
||||||
note: "VIC-20 Kernal NTSC. Embedded in core."
|
note: "VIC-20 Kernal NTSC. Embedded in core."
|
||||||
source_ref: "vice/src/vic20/vic20rom.h:52"
|
source_ref: "vice/src/vic20/vic20rom.h:52"
|
||||||
|
|
||||||
@@ -431,6 +536,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: c9ead45e6674d1042ca6199160e8583c23aeac22
|
||||||
|
md5: 317f93bcbc5ee15da085a51a306f2c61
|
||||||
|
crc32: 336900d7
|
||||||
note: "VIC-20 Kernal Japanese NTSC Rev 2. Embedded in core."
|
note: "VIC-20 Kernal Japanese NTSC Rev 2. Embedded in core."
|
||||||
source_ref: "vice/src/vic20/vic20rom.h:51"
|
source_ref: "vice/src/vic20/vic20rom.h:51"
|
||||||
|
|
||||||
@@ -440,6 +548,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: 4fd85ab6647ee2ac7ba40f729323f2472d35b9b4
|
||||||
|
md5: d390e340e94e1bef0f2fdfe9fa850993
|
||||||
|
crc32: 83e032a6
|
||||||
note: "VIC-20 Character Generator (default). Embedded in core."
|
note: "VIC-20 Character Generator (default). Embedded in core."
|
||||||
source_ref: "vice/src/vic20/vic20rom.h:56"
|
source_ref: "vice/src/vic20/vic20rom.h:56"
|
||||||
|
|
||||||
@@ -449,6 +560,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: dae61ac03065aa2904af5c123ce821855898c555
|
||||||
|
md5: 7e6e41b5b60fec798743afd7063b42ed
|
||||||
|
crc32: fcfd8a4b
|
||||||
note: "VIC-20 Japanese Character Generator. Embedded in core."
|
note: "VIC-20 Japanese Character Generator. Embedded in core."
|
||||||
source_ref: "vice/src/vic20/vic20rom.h:57"
|
source_ref: "vice/src/vic20/vic20rom.h:57"
|
||||||
|
|
||||||
@@ -462,6 +576,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 161c96b4ad20f3a4f2321808e37a5ded26a135dd
|
||||||
|
md5: 44a4ae400e3b4f7533a47ae0df1be78c
|
||||||
|
crc32: 74eaae87
|
||||||
note: "Plus/4 BASIC ROM. Embedded in core."
|
note: "Plus/4 BASIC ROM. Embedded in core."
|
||||||
source_ref: "vice/src/plus4/plus4rom.h:33"
|
source_ref: "vice/src/plus4/plus4rom.h:33"
|
||||||
|
|
||||||
@@ -471,6 +588,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 7c7e07f016391174a557e790c4ef1cbe33512cdb
|
||||||
|
md5: 89f5263665a8dc10c8f8abc38f5f7eb9
|
||||||
|
crc32: 71c07bd4
|
||||||
note: "Plus/4 Kernal PAL Rev 5 (default PAL). Embedded in core."
|
note: "Plus/4 Kernal PAL Rev 5 (default PAL). Embedded in core."
|
||||||
source_ref: "vice/src/plus4/plus4rom.h:36"
|
source_ref: "vice/src/plus4/plus4rom.h:36"
|
||||||
|
|
||||||
@@ -480,6 +600,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: a3d9e5be091b98de39a046ab167fb7632d053682
|
||||||
|
md5: b3c450c36a88b491281d18fdf3e94ab0
|
||||||
|
crc32: 70295038
|
||||||
note: "Plus/4 Kernal NTSC Rev 5 (default NTSC). Embedded in core."
|
note: "Plus/4 Kernal NTSC Rev 5 (default NTSC). Embedded in core."
|
||||||
source_ref: "vice/src/plus4/plus4rom.h:37"
|
source_ref: "vice/src/plus4/plus4rom.h:37"
|
||||||
|
|
||||||
@@ -489,6 +612,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 3c77caf72914c1c0a0875b3a7f6935cd30c54201
|
||||||
|
md5: a213823557421b66f9813ff19af48c01
|
||||||
|
crc32: dbdc3319
|
||||||
note: "Plus/4 Kernal NTSC Rev 1 (V232 prototype). Embedded in core."
|
note: "Plus/4 Kernal NTSC Rev 1 (V232 prototype). Embedded in core."
|
||||||
source_ref: "vice/src/plus4/plus4rom.h:35"
|
source_ref: "vice/src/plus4/plus4rom.h:35"
|
||||||
|
|
||||||
@@ -498,6 +624,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: b9a5b5dacd57ca117ef0b3af29e91998bf4d7e5f
|
||||||
|
md5: 7abb51257595b233a1a63ae58c330a65
|
||||||
|
crc32: 84fd4f7a
|
||||||
note: "Commodore 364 prototype Kernal. Embedded in core."
|
note: "Commodore 364 prototype Kernal. Embedded in core."
|
||||||
source_ref: "vice/src/plus4/plus4rom.h:38"
|
source_ref: "vice/src/plus4/plus4rom.h:38"
|
||||||
|
|
||||||
@@ -507,6 +636,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 3b69f6e7cb4c18bb08e203fb18b7dabfa853390f
|
||||||
|
md5: 2994d5463ef8524deb4231a9c764767c
|
||||||
|
crc32: 4fd1d8cb
|
||||||
note: "3-Plus-1 software ROM low. Embedded in core."
|
note: "3-Plus-1 software ROM low. Embedded in core."
|
||||||
source_ref: "vice/src/plus4/plus4rom.h:40"
|
source_ref: "vice/src/plus4/plus4rom.h:40"
|
||||||
|
|
||||||
@@ -516,6 +648,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 0ad7ac2db7da692d972e586ca0dfd747d82c7693
|
||||||
|
md5: ac34591c820fe607d527e04e95bce465
|
||||||
|
crc32: 109de2fc
|
||||||
note: "3-Plus-1 software ROM high. Embedded in core."
|
note: "3-Plus-1 software ROM high. Embedded in core."
|
||||||
source_ref: "vice/src/plus4/plus4rom.h:41"
|
source_ref: "vice/src/plus4/plus4rom.h:41"
|
||||||
|
|
||||||
@@ -525,6 +660,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 59af401cbb2194f689898271c6e8aafa28a7af11
|
||||||
|
md5: 0073ace3874a2c5ca5de9cf64cdfbbd4
|
||||||
|
crc32: 5227c2ee
|
||||||
note: "Commodore 364 prototype function ROM low. Embedded in core."
|
note: "Commodore 364 prototype function ROM low. Embedded in core."
|
||||||
source_ref: "vice/src/plus4/plus4rom.h:43"
|
source_ref: "vice/src/plus4/plus4rom.h:43"
|
||||||
|
|
||||||
@@ -538,6 +676,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 3be9cd41b646fefa00d80f1c3433a06146e97c59
|
||||||
|
md5: f328e785835907006604423222db7bbf
|
||||||
|
crc32: aff78300
|
||||||
note: "PET BASIC 1.0 ROM (PET 2001). Embedded in core."
|
note: "PET BASIC 1.0 ROM (PET 2001). Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:55"
|
source_ref: "vice/src/pet/petrom.h:55"
|
||||||
|
|
||||||
@@ -547,6 +688,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 9322a9f0354b9049847d98d3a045fbec860a6264
|
||||||
|
md5: b69739387bebe999227ae0cf25aa1e91
|
||||||
|
crc32: cf35e68b
|
||||||
note: "PET BASIC 2.0 ROM. Embedded in core."
|
note: "PET BASIC 2.0 ROM. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:56"
|
source_ref: "vice/src/pet/petrom.h:56"
|
||||||
|
|
||||||
@@ -556,6 +700,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 12288
|
size: 12288
|
||||||
|
sha1: d70bec479e1e3a0d0908a4897066e9959bbc11c8
|
||||||
|
md5: d22d2a1912a0cdbd9e7c8b103541b2c6
|
||||||
|
crc32: 2a940f0a
|
||||||
note: "PET BASIC 4.0 ROM. Embedded in core."
|
note: "PET BASIC 4.0 ROM. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:57"
|
source_ref: "vice/src/pet/petrom.h:57"
|
||||||
|
|
||||||
@@ -565,6 +712,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: 32dc08828e88c74d6433156e64d402b564556308
|
||||||
|
md5: 61b7e2fd04d63b0702951ba40899cd72
|
||||||
|
crc32: f0186492
|
||||||
note: "PET Kernal 1.0 (PET 2001). Embedded in core."
|
note: "PET Kernal 1.0 (PET 2001). Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:51"
|
source_ref: "vice/src/pet/petrom.h:51"
|
||||||
|
|
||||||
@@ -574,6 +724,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: 38742bdf449f629bcba6276ef24d3daeb7da6e84
|
||||||
|
md5: 51a38bfef8f9e72cb64bf7d874b4c8c6
|
||||||
|
crc32: f02238e2
|
||||||
note: "PET Kernal 2.0. Embedded in core."
|
note: "PET Kernal 2.0. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:52"
|
source_ref: "vice/src/pet/petrom.h:52"
|
||||||
|
|
||||||
@@ -583,6 +736,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: 96a0fa56e0c937da92971d9c99d504e44e898806
|
||||||
|
md5: 16ec21443ea5431ab63d511061054e6f
|
||||||
|
crc32: cc5298a1
|
||||||
note: "PET Kernal 4.0. Embedded in core."
|
note: "PET Kernal 4.0. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:53"
|
source_ref: "vice/src/pet/petrom.h:53"
|
||||||
|
|
||||||
@@ -592,6 +748,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 2048
|
size: 2048
|
||||||
|
sha1: f02f5fb492ba93dbbd390f24c10f7a832dec432a
|
||||||
|
md5: ef9bd0e62dfc47eb463fef20d0344826
|
||||||
|
crc32: 9e1c5cea
|
||||||
note: "PET Editor 1.0 Normal (graphics keyboard). Embedded in core."
|
note: "PET Editor 1.0 Normal (graphics keyboard). Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:59"
|
source_ref: "vice/src/pet/petrom.h:59"
|
||||||
|
|
||||||
@@ -601,6 +760,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 2048
|
size: 2048
|
||||||
|
sha1: 5e5502ce32f5a7e387d65efe058916282041e54b
|
||||||
|
md5: cb8e8404c0b28eda10469792dfd1dbc2
|
||||||
|
crc32: e459ab32
|
||||||
note: "PET Editor 2.0 Normal (graphics keyboard). Embedded in core."
|
note: "PET Editor 2.0 Normal (graphics keyboard). Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:60"
|
source_ref: "vice/src/pet/petrom.h:60"
|
||||||
|
|
||||||
@@ -610,6 +772,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 2048
|
size: 2048
|
||||||
|
sha1: 174ace3a8c0348cd21d39cc864e2adc58b0101a9
|
||||||
|
md5: 7f87889ca7ee2537f0c1993d35d0fb18
|
||||||
|
crc32: 05db957e
|
||||||
note: "PET Editor 2.0 Business keyboard. Embedded in core."
|
note: "PET Editor 2.0 Business keyboard. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:61"
|
source_ref: "vice/src/pet/petrom.h:61"
|
||||||
|
|
||||||
@@ -619,6 +784,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 2048
|
size: 2048
|
||||||
|
sha1: 05af284c914d53a52987b5f602466de75765f650
|
||||||
|
md5: b76d756e7ac8752ae0035f3ce5f1383c
|
||||||
|
crc32: 3370e359
|
||||||
note: "PET Editor 4.0, 40 col, Normal keyboard, 50Hz. Embedded in core."
|
note: "PET Editor 4.0, 40 col, Normal keyboard, 50Hz. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:62"
|
source_ref: "vice/src/pet/petrom.h:62"
|
||||||
|
|
||||||
@@ -628,6 +796,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 2048
|
size: 2048
|
||||||
|
sha1: 9f91fbabfdd532d003d2508f399574ba8ec6ee5f
|
||||||
|
md5: 8e69e040489098522846b1b1c63682c2
|
||||||
|
crc32: 16fb070c
|
||||||
note: "PET Editor 4.0, 40 col, Business keyboard, 50Hz. Embedded in core."
|
note: "PET Editor 4.0, 40 col, Business keyboard, 50Hz. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:65"
|
source_ref: "vice/src/pet/petrom.h:65"
|
||||||
|
|
||||||
@@ -637,6 +808,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 2048
|
size: 2048
|
||||||
|
sha1: 81975eab31a8f4f51ae2a20d099a567c7b3f2dd1
|
||||||
|
md5: 3a0e2ef328040aa30b30a8134426879a
|
||||||
|
crc32: 845a44e6
|
||||||
note: "PET Editor 4.0, 80 col, Business keyboard, 50Hz. Embedded in core."
|
note: "PET Editor 4.0, 80 col, Business keyboard, 50Hz. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:63"
|
source_ref: "vice/src/pet/petrom.h:63"
|
||||||
|
|
||||||
@@ -646,6 +820,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 2048
|
size: 2048
|
||||||
|
sha1: 3e067cc621e4beafca2b90cb8f6dba975df2855b
|
||||||
|
md5: 29a82eb54e73ebc5673c718c489b174b
|
||||||
|
crc32: 54f32f45
|
||||||
note: "PET Character Generator 1 (original PET 2001). Embedded in core."
|
note: "PET Character Generator 1 (original PET 2001). Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:46"
|
source_ref: "vice/src/pet/petrom.h:46"
|
||||||
|
|
||||||
@@ -655,6 +832,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 2048
|
size: 2048
|
||||||
|
sha1: 0157a2d55b7ac4eaeb38475889ebeea52e2593db
|
||||||
|
md5: 9880432e633b15998d58884ff34c4e70
|
||||||
|
crc32: d8408674
|
||||||
note: "PET Character Generator 2. Embedded in core."
|
note: "PET Character Generator 2. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:47"
|
source_ref: "vice/src/pet/petrom.h:47"
|
||||||
|
|
||||||
@@ -664,6 +844,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: bf346f11595a3e65e55d6aeeaa2c0cec807b66c7
|
||||||
|
md5: dd30641d9e6a221edd725d1e529dcbdb
|
||||||
|
crc32: ee8229c4
|
||||||
note: "SuperPET Character Generator. Embedded in core."
|
note: "SuperPET Character Generator. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:48"
|
source_ref: "vice/src/pet/petrom.h:48"
|
||||||
|
|
||||||
@@ -673,6 +856,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: 0414b3ab847c8977eb05c2fcc72efcf2f9d92871
|
||||||
|
md5: 6eb1c1bfa6ce1444737794432966dfcc
|
||||||
|
crc32: 728a998b
|
||||||
note: "SuperPET Waterloo microEngine 6809 ROM at $A000. Embedded in core."
|
note: "SuperPET Waterloo microEngine 6809 ROM at $A000. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:75"
|
source_ref: "vice/src/pet/petrom.h:75"
|
||||||
|
|
||||||
@@ -682,6 +868,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: df154939b934d0aeeb376813ec1ba0d43c2a3378
|
||||||
|
md5: 537498d75ecf761d4991f9ebd85129ca
|
||||||
|
crc32: 6beb7c62
|
||||||
note: "SuperPET Waterloo microEngine 6809 ROM at $B000. Embedded in core."
|
note: "SuperPET Waterloo microEngine 6809 ROM at $B000. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:76"
|
source_ref: "vice/src/pet/petrom.h:76"
|
||||||
|
|
||||||
@@ -691,6 +880,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: 6c5b0cce97068f8841112ba6d5cd8e568b562fa3
|
||||||
|
md5: 3e8dd04902dc9fee172084698f84695f
|
||||||
|
crc32: 5db4983d
|
||||||
note: "SuperPET Waterloo microEngine 6809 ROM at $C000. Embedded in core."
|
note: "SuperPET Waterloo microEngine 6809 ROM at $C000. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:77"
|
source_ref: "vice/src/pet/petrom.h:77"
|
||||||
|
|
||||||
@@ -700,6 +892,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: b42a2050a319a1ffca7868a8d8d635fadd37ec37
|
||||||
|
md5: 80f4d2351ee19673820989919c7c1e9b
|
||||||
|
crc32: f55fc559
|
||||||
note: "SuperPET Waterloo microEngine 6809 ROM at $D000. Embedded in core."
|
note: "SuperPET Waterloo microEngine 6809 ROM at $D000. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:78"
|
source_ref: "vice/src/pet/petrom.h:78"
|
||||||
|
|
||||||
@@ -709,6 +904,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 2048
|
size: 2048
|
||||||
|
sha1: e8ce8347451a001214a5e71a13081b38b4be23bc
|
||||||
|
md5: a740ff5d0d1132ab18cfc1974fca908d
|
||||||
|
crc32: b2cee903
|
||||||
note: "SuperPET Waterloo microEngine 6809 ROM at $E000. Embedded in core."
|
note: "SuperPET Waterloo microEngine 6809 ROM at $E000. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:79"
|
source_ref: "vice/src/pet/petrom.h:79"
|
||||||
|
|
||||||
@@ -718,6 +916,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: 9b4a5134d20345171e7303445f87c4e0b9addc96
|
||||||
|
md5: 049e2d26fde71a741f6075ecbf0a432d
|
||||||
|
crc32: f42df0cb
|
||||||
note: "SuperPET Waterloo microEngine 6809 ROM at $F000. Embedded in core."
|
note: "SuperPET Waterloo microEngine 6809 ROM at $F000. Embedded in core."
|
||||||
source_ref: "vice/src/pet/petrom.h:80"
|
source_ref: "vice/src/pet/petrom.h:80"
|
||||||
|
|
||||||
@@ -731,6 +932,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 9409f92e167984096fe4d5913714bff6214c3b2d
|
||||||
|
md5: 3ad5c7182006bcad1597583dbc8505c9
|
||||||
|
crc32: a8ff9372
|
||||||
note: "CBM-II BASIC 128 (CBM 610/620/710/720). Embedded in core."
|
note: "CBM-II BASIC 128 (CBM 610/620/710/720). Embedded in core."
|
||||||
source_ref: "vice/src/cbm2/cbm2rom.h:41"
|
source_ref: "vice/src/cbm2/cbm2rom.h:41"
|
||||||
|
|
||||||
@@ -740,6 +944,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 53314b4d565cc405a67a0936b935e6e08955580d
|
||||||
|
md5: 6a505014e543c62e99668080a3b80b40
|
||||||
|
crc32: 5db15870
|
||||||
note: "CBM-II BASIC 256 (CBM 710/720 with 256K). Embedded in core."
|
note: "CBM-II BASIC 256 (CBM 710/720 with 256K). Embedded in core."
|
||||||
source_ref: "vice/src/cbm2/cbm2rom.h:42"
|
source_ref: "vice/src/cbm2/cbm2rom.h:42"
|
||||||
|
|
||||||
@@ -749,6 +956,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: e69531d45f5993f8e53c6bd9ab2a7bc10fe2d02f
|
||||||
|
md5: 5a9559ceaf1a0bef0e721242c67a030d
|
||||||
|
crc32: 9a468e5d
|
||||||
note: "CBM-II BASIC 500 (CBM 510/P500). Embedded in core."
|
note: "CBM-II BASIC 500 (CBM 510/P500). Embedded in core."
|
||||||
source_ref: "vice/src/cbm2/cbm2rom.h:43"
|
source_ref: "vice/src/cbm2/cbm2rom.h:43"
|
||||||
|
|
||||||
@@ -758,6 +968,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: abb26418b9e1614a8f52bdeee0822d4a96071439
|
||||||
|
md5: e0346953e77bd1353ebf53aaa5b6f0b0
|
||||||
|
crc32: 09a5667e
|
||||||
note: "CBM-II Kernal (CBM 610/620/710/720). Embedded in core."
|
note: "CBM-II Kernal (CBM 610/620/710/720). Embedded in core."
|
||||||
source_ref: "vice/src/cbm2/cbm2rom.h:45"
|
source_ref: "vice/src/cbm2/cbm2rom.h:45"
|
||||||
|
|
||||||
@@ -767,6 +980,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: 097197d4d08e0b82e0466a5f1fbd49a24f3d2523
|
||||||
|
md5: 1a19593625acdc5af96a5e78b1a23f37
|
||||||
|
crc32: f46bbd2b
|
||||||
note: "CBM-II Kernal 500 (CBM 510/P500). Embedded in core."
|
note: "CBM-II Kernal 500 (CBM 510/P500). Embedded in core."
|
||||||
source_ref: "vice/src/cbm2/cbm2rom.h:46"
|
source_ref: "vice/src/cbm2/cbm2rom.h:46"
|
||||||
|
|
||||||
@@ -776,6 +992,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: adc7c31e18c7c7413d54802ef2f4193da14711aa
|
||||||
|
md5: 12a4202f5331d45af846af6c58fba946
|
||||||
|
crc32: ec4272ee
|
||||||
note: "CBM-II Character Generator 500 (VIC-II based, CBM 510/P500). Embedded in core."
|
note: "CBM-II Character Generator 500 (VIC-II based, CBM 510/P500). Embedded in core."
|
||||||
source_ref: "vice/src/cbm2/cbm2rom.h:37"
|
source_ref: "vice/src/cbm2/cbm2rom.h:37"
|
||||||
|
|
||||||
@@ -785,6 +1004,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: e63bf18da48e5a53c99ef127c1ae721333d1d102
|
||||||
|
md5: 2818722af27ceae6952c08cf83a076f9
|
||||||
|
crc32: 1acf5098
|
||||||
note: "CBM-II Character Generator 600 (CBM 610/620). Embedded in core."
|
note: "CBM-II Character Generator 600 (CBM 610/620). Embedded in core."
|
||||||
source_ref: "vice/src/cbm2/cbm2rom.h:38"
|
source_ref: "vice/src/cbm2/cbm2rom.h:38"
|
||||||
|
|
||||||
@@ -794,6 +1016,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: e7f3cbc8e282f79a00c3e95d75c8d725ee3c6287
|
||||||
|
md5: 03f32477905d77e2135857076ec31efa
|
||||||
|
crc32: 3a350bc3
|
||||||
note: "CBM-II Character Generator 700 (CBM 710/720). Embedded in core."
|
note: "CBM-II Character Generator 700 (CBM 710/720). Embedded in core."
|
||||||
source_ref: "vice/src/cbm2/cbm2rom.h:39"
|
source_ref: "vice/src/cbm2/cbm2rom.h:39"
|
||||||
|
|
||||||
@@ -807,6 +1032,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 65536
|
size: 65536
|
||||||
|
sha1: f5b6da17ee8206ff0d2258e1d6e8b798147c2650
|
||||||
|
md5: 006862e9a52d987970435988e3803c71
|
||||||
|
crc32: 89c1a062
|
||||||
note: "SuperCPU64 internal ROM (default). Embedded in core."
|
note: "SuperCPU64 internal ROM (default). Embedded in core."
|
||||||
source_ref: "retrodep/ui.c:269"
|
source_ref: "retrodep/ui.c:269"
|
||||||
|
|
||||||
@@ -816,6 +1044,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: adc7c31e18c7c7413d54802ef2f4193da14711aa
|
||||||
|
md5: 12a4202f5331d45af846af6c58fba946
|
||||||
|
crc32: ec4272ee
|
||||||
note: "C64 Character Generator (used by SCPU64). Embedded in core."
|
note: "C64 Character Generator (used by SCPU64). Embedded in core."
|
||||||
source_ref: "vice/src/scpu64/scpu64rom.h:36"
|
source_ref: "vice/src/scpu64/scpu64rom.h:36"
|
||||||
|
|
||||||
@@ -825,6 +1056,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 4096
|
size: 4096
|
||||||
|
sha1: 0fad19dbcdb12461c99657b2979dbb5c2e47b527
|
||||||
|
md5: cf32a93c0a693ed359a4f483ef6db53d
|
||||||
|
crc32: 1604f6c1
|
||||||
note: "C64 Japanese Character Generator (used by SCPU64). Embedded in core."
|
note: "C64 Japanese Character Generator (used by SCPU64). Embedded in core."
|
||||||
source_ref: "vice/src/scpu64/scpu64rom.h:37"
|
source_ref: "vice/src/scpu64/scpu64rom.h:37"
|
||||||
|
|
||||||
@@ -854,6 +1088,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: 3477c14e0c79faa445224dad16534f04ed143e44
|
||||||
|
md5: 87e849da3c87549848550fe4dd4d1aae
|
||||||
|
crc32: 718d42b1
|
||||||
note: "1540 drive DOS ROM. Embedded in core."
|
note: "1540 drive DOS ROM. Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:88"
|
source_ref: "vice/src/drive/driverom.h:88"
|
||||||
|
|
||||||
@@ -863,6 +1100,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: ab16f56989b27d89babe5f89c5a8cb3da71a82f0
|
||||||
|
md5: a0ce8439d1b8dcf2e1430461f7233a72
|
||||||
|
crc32: 57224cde
|
||||||
note: "1541 drive DOS ROM. Embedded in core."
|
note: "1541 drive DOS ROM. Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:89"
|
source_ref: "vice/src/drive/driverom.h:89"
|
||||||
|
|
||||||
@@ -872,6 +1112,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: d3b78c3dbac55f5199f33f3fe0036439811f7fb3
|
||||||
|
md5: ada295382a1f2df772a7e5c5c6f34215
|
||||||
|
crc32: 899fa3c5
|
||||||
note: "1541-II drive DOS ROM. Embedded in core."
|
note: "1541-II drive DOS ROM. Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:90"
|
source_ref: "vice/src/drive/driverom.h:90"
|
||||||
|
|
||||||
@@ -881,6 +1124,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: fae3c788ad9a6cc2dbdfbcf6c0264b2ca921d55e
|
||||||
|
md5: 0c767bf0a84d7751af056e53a074c9e2
|
||||||
|
crc32: 6d16d024
|
||||||
note: "1551 drive DOS ROM (Plus/4 specific). Embedded in core."
|
note: "1551 drive DOS ROM (Plus/4 specific). Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:92"
|
source_ref: "vice/src/drive/driverom.h:92"
|
||||||
|
|
||||||
@@ -890,6 +1136,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 32768
|
size: 32768
|
||||||
|
sha1: 5fc06dc82ff6840f183bd43a4d9b8a16956b2f56
|
||||||
|
md5: f0799353f0e22cf7d783e447adcafde2
|
||||||
|
crc32: 5a0c7937
|
||||||
note: "1570 drive DOS ROM. Embedded in core."
|
note: "1570 drive DOS ROM. Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:93"
|
source_ref: "vice/src/drive/driverom.h:93"
|
||||||
|
|
||||||
@@ -899,6 +1148,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 32768
|
size: 32768
|
||||||
|
sha1: f1be619c106641a685f6609e4d43d6fc9eac1e70
|
||||||
|
md5: dae964d64b7843ff86c008d396dda208
|
||||||
|
crc32: 5755bae3
|
||||||
note: "1571 drive DOS ROM. Embedded in core."
|
note: "1571 drive DOS ROM. Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:94"
|
source_ref: "vice/src/drive/driverom.h:94"
|
||||||
|
|
||||||
@@ -908,6 +1160,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 32768
|
size: 32768
|
||||||
|
sha1: 14ee7a0fb7e1c59c51fbf781f944387037daa3ee
|
||||||
|
md5: f9158328494b3e269f86ef419792c2e5
|
||||||
|
crc32: f24efcc4
|
||||||
note: "1571CR drive DOS ROM (cost-reduced, C128D internal). Embedded in core."
|
note: "1571CR drive DOS ROM (cost-reduced, C128D internal). Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:95"
|
source_ref: "vice/src/drive/driverom.h:95"
|
||||||
|
|
||||||
@@ -917,6 +1172,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 32768
|
size: 32768
|
||||||
|
sha1: 01228eae6f066bd9b7b2b6a7fa3f667e41dad393
|
||||||
|
md5: 6a82f92aea2a3afa190fe32d565f39e7
|
||||||
|
crc32: a9011b84
|
||||||
note: "1581 drive DOS ROM. Embedded in core."
|
note: "1581 drive DOS ROM. Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:96"
|
source_ref: "vice/src/drive/driverom.h:96"
|
||||||
|
|
||||||
@@ -926,6 +1184,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: d50b093828888146596f17ae0df9ef3dfde71b05
|
||||||
|
md5: 2d967790361aa77de87a24fb93e342f9
|
||||||
|
crc32: 87e6a94e
|
||||||
note: "CBM 1001 (SFD-1001) drive DOS ROM. Embedded in core."
|
note: "CBM 1001 (SFD-1001) drive DOS ROM. Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:70"
|
source_ref: "vice/src/drive/driverom.h:70"
|
||||||
|
|
||||||
@@ -935,6 +1196,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: c53e180a96649ceb3f421739e8dc66faba7cba44
|
||||||
|
md5: 3454c06fd2275f5bcbfe936dcdf8059b
|
||||||
|
crc32: 21b80fdf
|
||||||
note: "CBM 2031 drive DOS ROM. Embedded in core."
|
note: "CBM 2031 drive DOS ROM. Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:73"
|
source_ref: "vice/src/drive/driverom.h:73"
|
||||||
|
|
||||||
@@ -944,6 +1208,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 8192
|
size: 8192
|
||||||
|
sha1: e37b3bfd801eb19dea50cf8b4a6af8613c3520d3
|
||||||
|
md5: 3efff682000fd841b4dd6560bf53e37c
|
||||||
|
crc32: d04c1fbb
|
||||||
note: "CBM 2040 dual drive DOS ROM. Embedded in core."
|
note: "CBM 2040 dual drive DOS ROM. Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:76"
|
source_ref: "vice/src/drive/driverom.h:76"
|
||||||
|
|
||||||
@@ -953,6 +1220,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 12288
|
size: 12288
|
||||||
|
sha1: 02bd4b0c8508b3874b95799a9a63caf369c837de
|
||||||
|
md5: 139e72a58b7ddb2f92ceb18c8735c53c
|
||||||
|
crc32: f4967a7f
|
||||||
note: "CBM 3040 dual drive DOS ROM. Embedded in core."
|
note: "CBM 3040 dual drive DOS ROM. Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:79"
|
source_ref: "vice/src/drive/driverom.h:79"
|
||||||
|
|
||||||
@@ -962,6 +1232,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 12288
|
size: 12288
|
||||||
|
sha1: 245abbe76581558d270cdbb6fe55f56748403d8e
|
||||||
|
md5: 2fce6a76c738d1a10c189bf0660d868e
|
||||||
|
crc32: 40e0ebaa
|
||||||
note: "CBM 4040 dual drive DOS ROM. Embedded in core."
|
note: "CBM 4040 dual drive DOS ROM. Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:82"
|
source_ref: "vice/src/drive/driverom.h:82"
|
||||||
|
|
||||||
@@ -971,6 +1244,9 @@ files:
|
|||||||
hle_fallback: true
|
hle_fallback: true
|
||||||
embedded: true
|
embedded: true
|
||||||
size: 16384
|
size: 16384
|
||||||
|
sha1: c48df2cbb0eea656c3243df7ea8bfefcd171b8e8
|
||||||
|
md5: d6d4df6f2811767de6f5bf46ad7fba69
|
||||||
|
crc32: 632a328e
|
||||||
note: "CBM D9090/D9060 hard drive DOS ROM. Embedded in core."
|
note: "CBM D9090/D9060 hard drive DOS ROM. Embedded in core."
|
||||||
source_ref: "vice/src/drive/driverom.h:85"
|
source_ref: "vice/src/drive/driverom.h:85"
|
||||||
|
|
||||||
|
|||||||
@@ -397,5 +397,6 @@ files:
|
|||||||
system: dragon64
|
system: dragon64
|
||||||
description: "Ikon Ultra Drive Dragonfly ROM 2.3"
|
description: "Ikon Ultra Drive Dragonfly ROM 2.3"
|
||||||
required: false
|
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)"
|
source_ref: "xroar.c:715 (romlist ikon), ikon.c:151 (default @ikon)"
|
||||||
note: "Experimental. Ikon Ultra Drive storage interface. Older version: dragonfly-1.3."
|
note: "Experimental. Ikon Ultra Drive storage interface. Older version: dragonfly-1.3."
|
||||||
|
|||||||
@@ -138,6 +138,8 @@ files:
|
|||||||
|
|
||||||
- name: Custom.dat
|
- name: Custom.dat
|
||||||
path: zc210/sfx/Custom.dat
|
path: zc210/sfx/Custom.dat
|
||||||
|
category: game_data
|
||||||
description: user-provided custom SFX replacement
|
description: user-provided custom SFX replacement
|
||||||
required: false
|
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"
|
source_ref: "zelda.cpp:1193-1218, libretro.cpp:148"
|
||||||
|
|||||||
+46
@@ -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."
|
Write-Host "`nDone. $downloaded downloaded, $upToDate already up to date."
|
||||||
|
|||||||
+42
-7
@@ -192,9 +192,9 @@ def detect_platforms(os_type: str) -> list[tuple[str, Path]]:
|
|||||||
if retrodeck_cfg.exists():
|
if retrodeck_cfg.exists():
|
||||||
bios_path = _parse_bash_var(retrodeck_cfg, "rdhome")
|
bios_path = _parse_bash_var(retrodeck_cfg, "rdhome")
|
||||||
if bios_path:
|
if bios_path:
|
||||||
found.append(("retrodeck", Path(bios_path) / "bios"))
|
found.append(("retrodeck", Path(bios_path)))
|
||||||
else:
|
else:
|
||||||
found.append(("retrodeck", home / "retrodeck" / "bios"))
|
found.append(("retrodeck", home / "retrodeck"))
|
||||||
|
|
||||||
# RetroArch Flatpak
|
# RetroArch Flatpak
|
||||||
flatpak_cfg = home / ".var" / "app" / "org.libretro.RetroArch" / "config" / "retroarch" / "retroarch.cfg"
|
flatpak_cfg = home / ".var" / "app" / "org.libretro.RetroArch" / "config" / "retroarch" / "retroarch.cfg"
|
||||||
@@ -390,8 +390,16 @@ def do_standalone_copies(
|
|||||||
) -> tuple[int, int]:
|
) -> tuple[int, int]:
|
||||||
"""Copy BIOS files to standalone emulator directories.
|
"""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).
|
Returns (copied_count, skipped_count).
|
||||||
"""
|
"""
|
||||||
|
from fnmatch import fnmatch
|
||||||
|
|
||||||
copies = manifest.get("standalone_copies", [])
|
copies = manifest.get("standalone_copies", [])
|
||||||
if not copies:
|
if not copies:
|
||||||
return 0, 0
|
return 0, 0
|
||||||
@@ -400,21 +408,48 @@ def do_standalone_copies(
|
|||||||
skipped = 0
|
skipped = 0
|
||||||
|
|
||||||
for entry in copies:
|
for entry in copies:
|
||||||
src = bios_path / entry["file"]
|
# Note entries: print message if emulator detected
|
||||||
if not src.exists():
|
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
|
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, [])
|
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:
|
for target_dir_str in targets:
|
||||||
target_dir = Path(os.path.expandvars(os.path.expanduser(target_dir_str)))
|
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
|
dest = target_dir / src.name
|
||||||
try:
|
try:
|
||||||
shutil.copy2(src, dest)
|
shutil.copy2(src, dest)
|
||||||
copied += 1
|
copied += 1
|
||||||
except OSError:
|
except OSError:
|
||||||
skipped += 1
|
skipped += 1
|
||||||
else:
|
|
||||||
skipped += 1
|
|
||||||
|
|
||||||
return copied, skipped
|
return copied, skipped
|
||||||
|
|
||||||
|
|||||||
+290
-69
@@ -4,7 +4,7 @@
|
|||||||
"platform": "batocera",
|
"platform": "batocera",
|
||||||
"display_name": "Batocera",
|
"display_name": "Batocera",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"generated": "2026-04-01T14:41:41Z",
|
"generated": "2026-04-18T07:55:01Z",
|
||||||
"base_destination": "bios",
|
"base_destination": "bios",
|
||||||
"detect": [
|
"detect": [
|
||||||
{
|
{
|
||||||
@@ -14,9 +14,224 @@
|
|||||||
"bios_path": "/userdata/bios"
|
"bios_path": "/userdata/bios"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"standalone_copies": [],
|
"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": 1540,
|
"total_files": 1540,
|
||||||
"total_size": 3891615271,
|
"total_size": 4337691265,
|
||||||
"files": [
|
"files": [
|
||||||
{
|
{
|
||||||
"dest": "panafz1.bin",
|
"dest": "panafz1.bin",
|
||||||
@@ -2904,6 +3119,15 @@
|
|||||||
"blueMSX"
|
"blueMSX"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "Machines/Shared Roms/MSX2J.rom",
|
||||||
|
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||||
|
"size": 32768,
|
||||||
|
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
|
||||||
|
"cores": [
|
||||||
|
"blueMSX"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "Machines/Shared Roms/MSX2R2.ROM",
|
"dest": "Machines/Shared Roms/MSX2R2.ROM",
|
||||||
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
||||||
@@ -4498,7 +4722,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "MSX/msx.rom",
|
"dest": "MSX/MSX.ROM",
|
||||||
"sha1": "409e82adac40f6bdd18eb6c84e8b2fbdc7fb5498",
|
"sha1": "409e82adac40f6bdd18eb6c84e8b2fbdc7fb5498",
|
||||||
"size": 32768,
|
"size": 32768,
|
||||||
"repo_path": "bios/Microsoft/MSX/MSX.ROM",
|
"repo_path": "bios/Microsoft/MSX/MSX.ROM",
|
||||||
@@ -4543,7 +4767,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "MSX/msx2.rom",
|
"dest": "MSX/MSX2.ROM",
|
||||||
"sha1": "6103b39f1e38d1aa2d84b1c3219c44f1abb5436e",
|
"sha1": "6103b39f1e38d1aa2d84b1c3219c44f1abb5436e",
|
||||||
"size": 32768,
|
"size": 32768,
|
||||||
"repo_path": "bios/Microsoft/MSX/MSX2.ROM",
|
"repo_path": "bios/Microsoft/MSX/MSX2.ROM",
|
||||||
@@ -4552,7 +4776,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "MSX/msx2ext.rom",
|
"dest": "MSX/MSX2EXT.ROM",
|
||||||
"sha1": "5c1f9c7fb655e43d38e5dd1fcc6b942b2ff68b02",
|
"sha1": "5c1f9c7fb655e43d38e5dd1fcc6b942b2ff68b02",
|
||||||
"size": 16384,
|
"size": 16384,
|
||||||
"repo_path": "bios/Microsoft/MSX/MSX2EXT.ROM",
|
"repo_path": "bios/Microsoft/MSX/MSX2EXT.ROM",
|
||||||
@@ -6148,6 +6372,39 @@
|
|||||||
"FinalBurn Neo"
|
"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",
|
"dest": "gamegenie.nes",
|
||||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||||
@@ -8389,6 +8646,24 @@
|
|||||||
"NXEngine"
|
"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",
|
"dest": "NMS8245SystemROM1.08.bin",
|
||||||
"sha1": "cc57c1dcd7249ea9f8e2547244592e7d97308ed0",
|
"sha1": "cc57c1dcd7249ea9f8e2547244592e7d97308ed0",
|
||||||
@@ -9100,69 +9375,6 @@
|
|||||||
"SquirrelJME"
|
"SquirrelJME"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"dest": "kvs1.wav",
|
|
||||||
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
|
||||||
"size": 3436329,
|
|
||||||
"repo_path": "bios/Atari/2600/KVS1.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvs2.wav",
|
|
||||||
"sha1": "8b83b2eea01b3e08ceb885aeb153d4084bddb63c",
|
|
||||||
"size": 2086275,
|
|
||||||
"repo_path": "bios/Atari/2600/KVS2.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvs3.wav",
|
|
||||||
"sha1": "86896a1e272d8715489de9b407f0b8a42f82d4a0",
|
|
||||||
"size": 3720920,
|
|
||||||
"repo_path": "bios/Atari/2600/KVS3.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvb1.wav",
|
|
||||||
"sha1": "6a582aebcefd6e2a97bdd8968202aab9851a889c",
|
|
||||||
"size": 4219542,
|
|
||||||
"repo_path": "bios/Atari/2600/KVB1.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvb2.wav",
|
|
||||||
"sha1": "60a425c6bde3226ab731995562716321be20fc49",
|
|
||||||
"size": 9593878,
|
|
||||||
"repo_path": "bios/Atari/2600/KVB2.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvb3.wav",
|
|
||||||
"sha1": "5e34125c4d6c209b21d1c892f3df0ec1644fd0d8",
|
|
||||||
"size": 7676992,
|
|
||||||
"repo_path": "bios/Atari/2600/KVB3.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvshared.wav",
|
|
||||||
"sha1": "9adf10cdf1de833b194c7d8797ad1f041ad98dd3",
|
|
||||||
"size": 3059116,
|
|
||||||
"repo_path": "bios/Atari/2600/KVSHARED.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"dest": "KVS1.WAV",
|
"dest": "KVS1.WAV",
|
||||||
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
||||||
@@ -10657,6 +10869,15 @@
|
|||||||
"XRoar"
|
"XRoar"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "delta2.rom",
|
||||||
|
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||||
|
"size": 8192,
|
||||||
|
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||||
|
"cores": [
|
||||||
|
"XRoar"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "cp450dsk.rom",
|
"dest": "cp450dsk.rom",
|
||||||
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
||||||
|
|||||||
+37
-4
@@ -4,7 +4,7 @@
|
|||||||
"platform": "bizhawk",
|
"platform": "bizhawk",
|
||||||
"display_name": "BizHawk",
|
"display_name": "BizHawk",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"generated": "2026-04-01T14:00:10Z",
|
"generated": "2026-04-18T07:55:07Z",
|
||||||
"base_destination": "Firmware",
|
"base_destination": "Firmware",
|
||||||
"detect": [
|
"detect": [
|
||||||
{
|
{
|
||||||
@@ -19,8 +19,8 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"standalone_copies": [],
|
"standalone_copies": [],
|
||||||
"total_files": 527,
|
"total_files": 530,
|
||||||
"total_size": 2068127713,
|
"total_size": 2547895289,
|
||||||
"files": [
|
"files": [
|
||||||
{
|
{
|
||||||
"dest": "panafz1.bin",
|
"dest": "panafz1.bin",
|
||||||
@@ -285,7 +285,7 @@
|
|||||||
"dest": "VEC_Minestorm.vec",
|
"dest": "VEC_Minestorm.vec",
|
||||||
"sha1": "65d07426b520ddd3115d40f255511e0fd2e20ae7",
|
"sha1": "65d07426b520ddd3115d40f255511e0fd2e20ae7",
|
||||||
"size": 8192,
|
"size": 8192,
|
||||||
"repo_path": "bios/GCE/Vectrex/VEC_MineStorm.vec",
|
"repo_path": "bios/GCE/Vectrex/VEC_Minestorm.vec",
|
||||||
"cores": null
|
"cores": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -1274,6 +1274,39 @@
|
|||||||
"FinalBurn Neo"
|
"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",
|
"dest": "sl31253.bin",
|
||||||
"sha1": "81193965a374d77b99b4743d317824b53c3e3c78",
|
"sha1": "81193965a374d77b99b4743d317824b53c3e3c78",
|
||||||
|
|||||||
+196
-4
@@ -4,7 +4,7 @@
|
|||||||
"platform": "emudeck",
|
"platform": "emudeck",
|
||||||
"display_name": "EmuDeck",
|
"display_name": "EmuDeck",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"generated": "2026-04-01T14:41:53Z",
|
"generated": "2026-04-03T09:43:22Z",
|
||||||
"base_destination": "bios",
|
"base_destination": "bios",
|
||||||
"detect": [
|
"detect": [
|
||||||
{
|
{
|
||||||
@@ -34,19 +34,211 @@
|
|||||||
"linux": [
|
"linux": [
|
||||||
"$HOME/.local/share/yuzu/keys",
|
"$HOME/.local/share/yuzu/keys",
|
||||||
"$HOME/.local/share/eden/keys",
|
"$HOME/.local/share/eden/keys",
|
||||||
|
"$HOME/.local/share/citron/keys",
|
||||||
|
"$HOME/.local/share/suyu/keys",
|
||||||
"$HOME/.config/Ryujinx/system"
|
"$HOME/.config/Ryujinx/system"
|
||||||
],
|
],
|
||||||
"windows": [
|
"windows": [
|
||||||
"%APPDATA%\\yuzu\\keys",
|
"%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": {
|
"targets": {
|
||||||
"linux": [
|
"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"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+86
-17
@@ -4,7 +4,7 @@
|
|||||||
"platform": "lakka",
|
"platform": "lakka",
|
||||||
"display_name": "Lakka",
|
"display_name": "Lakka",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"generated": "2026-04-01T14:42:08Z",
|
"generated": "2026-04-18T07:55:35Z",
|
||||||
"base_destination": "system",
|
"base_destination": "system",
|
||||||
"detect": [
|
"detect": [
|
||||||
{
|
{
|
||||||
@@ -15,8 +15,8 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"standalone_copies": [],
|
"standalone_copies": [],
|
||||||
"total_files": 1620,
|
"total_files": 1627,
|
||||||
"total_size": 5255358024,
|
"total_size": 5735234905,
|
||||||
"files": [
|
"files": [
|
||||||
{
|
{
|
||||||
"dest": "3do_arcade_saot.bin",
|
"dest": "3do_arcade_saot.bin",
|
||||||
@@ -3438,6 +3438,15 @@
|
|||||||
"blueMSX"
|
"blueMSX"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "Machines/Shared Roms/MSX2J.rom",
|
||||||
|
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||||
|
"size": 32768,
|
||||||
|
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
|
||||||
|
"cores": [
|
||||||
|
"blueMSX"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "Machines/Shared Roms/MSX2R2.ROM",
|
"dest": "Machines/Shared Roms/MSX2R2.ROM",
|
||||||
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
||||||
@@ -5070,6 +5079,39 @@
|
|||||||
"storage": "release",
|
"storage": "release",
|
||||||
"release_asset": "vimana.zip"
|
"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",
|
"dest": "nes.pal",
|
||||||
"sha1": "37027d92e1015b82a7dc5c43e9f1649a961577ab",
|
"sha1": "37027d92e1015b82a7dc5c43e9f1649a961577ab",
|
||||||
@@ -7862,6 +7904,24 @@
|
|||||||
"NXEngine"
|
"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",
|
"dest": "mda.rom",
|
||||||
"sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f",
|
"sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f",
|
||||||
@@ -9650,6 +9710,15 @@
|
|||||||
"SameBoy"
|
"SameBoy"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "sdlpal/desc.dat",
|
||||||
|
"sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba",
|
||||||
|
"size": 16027,
|
||||||
|
"repo_path": "bios/sdlpal/desc.dat",
|
||||||
|
"cores": [
|
||||||
|
"SDLPAL"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "SkyEmu/dmg_rom.bin",
|
"dest": "SkyEmu/dmg_rom.bin",
|
||||||
"sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
"sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||||
@@ -9768,66 +9837,66 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvs1.wav",
|
"dest": "KVS1.WAV",
|
||||||
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
||||||
"size": 3436329,
|
"size": 3436329,
|
||||||
"repo_path": "bios/Atari/2600/KVS1.WAV",
|
"repo_path": "bios/Atari/2600/KVS1.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvs2.wav",
|
"dest": "KVS2.WAV",
|
||||||
"sha1": "8b83b2eea01b3e08ceb885aeb153d4084bddb63c",
|
"sha1": "8b83b2eea01b3e08ceb885aeb153d4084bddb63c",
|
||||||
"size": 2086275,
|
"size": 2086275,
|
||||||
"repo_path": "bios/Atari/2600/KVS2.WAV",
|
"repo_path": "bios/Atari/2600/KVS2.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvs3.wav",
|
"dest": "KVS3.WAV",
|
||||||
"sha1": "86896a1e272d8715489de9b407f0b8a42f82d4a0",
|
"sha1": "86896a1e272d8715489de9b407f0b8a42f82d4a0",
|
||||||
"size": 3720920,
|
"size": 3720920,
|
||||||
"repo_path": "bios/Atari/2600/KVS3.WAV",
|
"repo_path": "bios/Atari/2600/KVS3.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvb1.wav",
|
"dest": "KVB1.WAV",
|
||||||
"sha1": "6a582aebcefd6e2a97bdd8968202aab9851a889c",
|
"sha1": "6a582aebcefd6e2a97bdd8968202aab9851a889c",
|
||||||
"size": 4219542,
|
"size": 4219542,
|
||||||
"repo_path": "bios/Atari/2600/KVB1.WAV",
|
"repo_path": "bios/Atari/2600/KVB1.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvb2.wav",
|
"dest": "KVB2.WAV",
|
||||||
"sha1": "60a425c6bde3226ab731995562716321be20fc49",
|
"sha1": "60a425c6bde3226ab731995562716321be20fc49",
|
||||||
"size": 9593878,
|
"size": 9593878,
|
||||||
"repo_path": "bios/Atari/2600/KVB2.WAV",
|
"repo_path": "bios/Atari/2600/KVB2.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvb3.wav",
|
"dest": "KVB3.WAV",
|
||||||
"sha1": "5e34125c4d6c209b21d1c892f3df0ec1644fd0d8",
|
"sha1": "5e34125c4d6c209b21d1c892f3df0ec1644fd0d8",
|
||||||
"size": 7676992,
|
"size": 7676992,
|
||||||
"repo_path": "bios/Atari/2600/KVB3.WAV",
|
"repo_path": "bios/Atari/2600/KVB3.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvshared.wav",
|
"dest": "KVSHARED.WAV",
|
||||||
"sha1": "9adf10cdf1de833b194c7d8797ad1f041ad98dd3",
|
"sha1": "9adf10cdf1de833b194c7d8797ad1f041ad98dd3",
|
||||||
"size": 3059116,
|
"size": 3059116,
|
||||||
"repo_path": "bios/Atari/2600/KVSHARED.WAV",
|
"repo_path": "bios/Atari/2600/KVSHARED.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
+314
-68
@@ -4,7 +4,7 @@
|
|||||||
"platform": "recalbox",
|
"platform": "recalbox",
|
||||||
"display_name": "Recalbox",
|
"display_name": "Recalbox",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"generated": "2026-04-01T14:42:39Z",
|
"generated": "2026-04-18T07:56:06Z",
|
||||||
"base_destination": "bios",
|
"base_destination": "bios",
|
||||||
"detect": [
|
"detect": [
|
||||||
{
|
{
|
||||||
@@ -14,9 +14,224 @@
|
|||||||
"bios_path": "/recalbox/share/bios"
|
"bios_path": "/recalbox/share/bios"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"standalone_copies": [],
|
"standalone_copies": [
|
||||||
"total_files": 1097,
|
{
|
||||||
"total_size": 3500142330,
|
"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": 1100,
|
||||||
|
"total_size": 3946303603,
|
||||||
"files": [
|
"files": [
|
||||||
{
|
{
|
||||||
"dest": "3do/panafz1.bin",
|
"dest": "3do/panafz1.bin",
|
||||||
@@ -540,7 +755,7 @@
|
|||||||
"dest": "dragon/deltados.rom",
|
"dest": "dragon/deltados.rom",
|
||||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||||
"size": 8192,
|
"size": 8192,
|
||||||
"repo_path": "bios/Dragon/Dragon/deltados.rom",
|
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||||
"cores": null
|
"cores": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -851,6 +1066,13 @@
|
|||||||
"repo_path": "bios/Microsoft/MSX/MSX2EXT.ROM",
|
"repo_path": "bios/Microsoft/MSX/MSX2EXT.ROM",
|
||||||
"cores": null
|
"cores": null
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "Machines/Shared Roms/MSX2J.rom",
|
||||||
|
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||||
|
"size": 32768,
|
||||||
|
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
|
||||||
|
"cores": null
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "Machines/Shared Roms/MSX2P.rom",
|
"dest": "Machines/Shared Roms/MSX2P.rom",
|
||||||
"sha1": "e90f80a61d94c617850c415e12ad70ac41e66bb7",
|
"sha1": "e90f80a61d94c617850c415e12ad70ac41e66bb7",
|
||||||
@@ -3797,6 +4019,39 @@
|
|||||||
"FinalBurn Neo"
|
"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",
|
"dest": "gamegenie.nes",
|
||||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||||
@@ -6452,6 +6707,24 @@
|
|||||||
"NXEngine"
|
"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",
|
"dest": "64DD_IPL.bin",
|
||||||
"sha1": "bf861922dcb78c316360e3e742f4f70ff63c9bc3",
|
"sha1": "bf861922dcb78c316360e3e742f4f70ff63c9bc3",
|
||||||
@@ -6695,69 +6968,6 @@
|
|||||||
"SAME CDi"
|
"SAME CDi"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"dest": "kvs1.wav",
|
|
||||||
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
|
||||||
"size": 3436329,
|
|
||||||
"repo_path": "bios/Atari/2600/KVS1.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvs2.wav",
|
|
||||||
"sha1": "8b83b2eea01b3e08ceb885aeb153d4084bddb63c",
|
|
||||||
"size": 2086275,
|
|
||||||
"repo_path": "bios/Atari/2600/KVS2.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvs3.wav",
|
|
||||||
"sha1": "86896a1e272d8715489de9b407f0b8a42f82d4a0",
|
|
||||||
"size": 3720920,
|
|
||||||
"repo_path": "bios/Atari/2600/KVS3.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvb1.wav",
|
|
||||||
"sha1": "6a582aebcefd6e2a97bdd8968202aab9851a889c",
|
|
||||||
"size": 4219542,
|
|
||||||
"repo_path": "bios/Atari/2600/KVB1.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvb2.wav",
|
|
||||||
"sha1": "60a425c6bde3226ab731995562716321be20fc49",
|
|
||||||
"size": 9593878,
|
|
||||||
"repo_path": "bios/Atari/2600/KVB2.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvb3.wav",
|
|
||||||
"sha1": "5e34125c4d6c209b21d1c892f3df0ec1644fd0d8",
|
|
||||||
"size": 7676992,
|
|
||||||
"repo_path": "bios/Atari/2600/KVB3.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvshared.wav",
|
|
||||||
"sha1": "9adf10cdf1de833b194c7d8797ad1f041ad98dd3",
|
|
||||||
"size": 3059116,
|
|
||||||
"repo_path": "bios/Atari/2600/KVSHARED.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"dest": "KVS1.WAV",
|
"dest": "KVS1.WAV",
|
||||||
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
||||||
@@ -6821,6 +7031,33 @@
|
|||||||
"Stella 2023"
|
"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",
|
"dest": "JiffyDOS_SX-64.bin",
|
||||||
"sha1": "942c2150123dc30f40b3df6086132ef0a3c43948",
|
"sha1": "942c2150123dc30f40b3df6086132ef0a3c43948",
|
||||||
@@ -7046,6 +7283,15 @@
|
|||||||
"XRoar"
|
"XRoar"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "delta2.rom",
|
||||||
|
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||||
|
"size": 8192,
|
||||||
|
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||||
|
"cores": [
|
||||||
|
"XRoar"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "cp450dsk.rom",
|
"dest": "cp450dsk.rom",
|
||||||
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
||||||
|
|||||||
+302
-18
@@ -4,7 +4,7 @@
|
|||||||
"platform": "retroarch",
|
"platform": "retroarch",
|
||||||
"display_name": "RetroArch",
|
"display_name": "RetroArch",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"generated": "2026-04-01T14:42:08Z",
|
"generated": "2026-04-18T07:55:35Z",
|
||||||
"base_destination": "system",
|
"base_destination": "system",
|
||||||
"detect": [
|
"detect": [
|
||||||
{
|
{
|
||||||
@@ -32,9 +32,224 @@
|
|||||||
"parse_key": "system_directory"
|
"parse_key": "system_directory"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"standalone_copies": [],
|
"standalone_copies": [
|
||||||
"total_files": 1620,
|
{
|
||||||
"total_size": 5255358024,
|
"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": [
|
"files": [
|
||||||
{
|
{
|
||||||
"dest": "3do_arcade_saot.bin",
|
"dest": "3do_arcade_saot.bin",
|
||||||
@@ -3456,6 +3671,15 @@
|
|||||||
"blueMSX"
|
"blueMSX"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "Machines/Shared Roms/MSX2J.rom",
|
||||||
|
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||||
|
"size": 32768,
|
||||||
|
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
|
||||||
|
"cores": [
|
||||||
|
"blueMSX"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "Machines/Shared Roms/MSX2R2.ROM",
|
"dest": "Machines/Shared Roms/MSX2R2.ROM",
|
||||||
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
||||||
@@ -5088,6 +5312,39 @@
|
|||||||
"storage": "release",
|
"storage": "release",
|
||||||
"release_asset": "vimana.zip"
|
"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",
|
"dest": "nes.pal",
|
||||||
"sha1": "37027d92e1015b82a7dc5c43e9f1649a961577ab",
|
"sha1": "37027d92e1015b82a7dc5c43e9f1649a961577ab",
|
||||||
@@ -7880,6 +8137,24 @@
|
|||||||
"NXEngine"
|
"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",
|
"dest": "mda.rom",
|
||||||
"sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f",
|
"sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f",
|
||||||
@@ -9668,6 +9943,15 @@
|
|||||||
"SameBoy"
|
"SameBoy"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "sdlpal/desc.dat",
|
||||||
|
"sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba",
|
||||||
|
"size": 16027,
|
||||||
|
"repo_path": "bios/sdlpal/desc.dat",
|
||||||
|
"cores": [
|
||||||
|
"SDLPAL"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "SkyEmu/dmg_rom.bin",
|
"dest": "SkyEmu/dmg_rom.bin",
|
||||||
"sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
"sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||||
@@ -9786,66 +10070,66 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvs1.wav",
|
"dest": "KVS1.WAV",
|
||||||
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
||||||
"size": 3436329,
|
"size": 3436329,
|
||||||
"repo_path": "bios/Atari/2600/KVS1.WAV",
|
"repo_path": "bios/Atari/2600/KVS1.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvs2.wav",
|
"dest": "KVS2.WAV",
|
||||||
"sha1": "8b83b2eea01b3e08ceb885aeb153d4084bddb63c",
|
"sha1": "8b83b2eea01b3e08ceb885aeb153d4084bddb63c",
|
||||||
"size": 2086275,
|
"size": 2086275,
|
||||||
"repo_path": "bios/Atari/2600/KVS2.WAV",
|
"repo_path": "bios/Atari/2600/KVS2.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvs3.wav",
|
"dest": "KVS3.WAV",
|
||||||
"sha1": "86896a1e272d8715489de9b407f0b8a42f82d4a0",
|
"sha1": "86896a1e272d8715489de9b407f0b8a42f82d4a0",
|
||||||
"size": 3720920,
|
"size": 3720920,
|
||||||
"repo_path": "bios/Atari/2600/KVS3.WAV",
|
"repo_path": "bios/Atari/2600/KVS3.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvb1.wav",
|
"dest": "KVB1.WAV",
|
||||||
"sha1": "6a582aebcefd6e2a97bdd8968202aab9851a889c",
|
"sha1": "6a582aebcefd6e2a97bdd8968202aab9851a889c",
|
||||||
"size": 4219542,
|
"size": 4219542,
|
||||||
"repo_path": "bios/Atari/2600/KVB1.WAV",
|
"repo_path": "bios/Atari/2600/KVB1.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvb2.wav",
|
"dest": "KVB2.WAV",
|
||||||
"sha1": "60a425c6bde3226ab731995562716321be20fc49",
|
"sha1": "60a425c6bde3226ab731995562716321be20fc49",
|
||||||
"size": 9593878,
|
"size": 9593878,
|
||||||
"repo_path": "bios/Atari/2600/KVB2.WAV",
|
"repo_path": "bios/Atari/2600/KVB2.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvb3.wav",
|
"dest": "KVB3.WAV",
|
||||||
"sha1": "5e34125c4d6c209b21d1c892f3df0ec1644fd0d8",
|
"sha1": "5e34125c4d6c209b21d1c892f3df0ec1644fd0d8",
|
||||||
"size": 7676992,
|
"size": 7676992,
|
||||||
"repo_path": "bios/Atari/2600/KVB3.WAV",
|
"repo_path": "bios/Atari/2600/KVB3.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "kvshared.wav",
|
"dest": "KVSHARED.WAV",
|
||||||
"sha1": "9adf10cdf1de833b194c7d8797ad1f041ad98dd3",
|
"sha1": "9adf10cdf1de833b194c7d8797ad1f041ad98dd3",
|
||||||
"size": 3059116,
|
"size": 3059116,
|
||||||
"repo_path": "bios/Atari/2600/KVSHARED.WAV",
|
"repo_path": "bios/Atari/2600/KVSHARED.WAV",
|
||||||
"cores": [
|
"cores": [
|
||||||
"Stella 2014"
|
"Stella 2023"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
+288
-4
@@ -4,7 +4,7 @@
|
|||||||
"platform": "retrobat",
|
"platform": "retrobat",
|
||||||
"display_name": "RetroBat",
|
"display_name": "RetroBat",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"generated": "2026-04-01T14:42:50Z",
|
"generated": "2026-04-03T09:44:16Z",
|
||||||
"base_destination": "bios",
|
"base_destination": "bios",
|
||||||
"detect": [
|
"detect": [
|
||||||
{
|
{
|
||||||
@@ -13,9 +13,224 @@
|
|||||||
"path": "%USERPROFILE%\\RetroBat\\bios"
|
"path": "%USERPROFILE%\\RetroBat\\bios"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"standalone_copies": [],
|
"standalone_copies": [
|
||||||
"total_files": 1162,
|
{
|
||||||
"total_size": 4297772175,
|
"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": [
|
"files": [
|
||||||
{
|
{
|
||||||
"dest": "panafz1.bin",
|
"dest": "panafz1.bin",
|
||||||
@@ -2525,6 +2740,15 @@
|
|||||||
"blueMSX"
|
"blueMSX"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "Machines/Shared Roms/MSX2J.rom",
|
||||||
|
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||||
|
"size": 32768,
|
||||||
|
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
|
||||||
|
"cores": [
|
||||||
|
"blueMSX"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "Machines/Shared Roms/MSX2R2.ROM",
|
"dest": "Machines/Shared Roms/MSX2R2.ROM",
|
||||||
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
||||||
@@ -3968,6 +4192,39 @@
|
|||||||
"storage": "release",
|
"storage": "release",
|
||||||
"release_asset": "vimana.zip"
|
"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",
|
"dest": "gamegenie.nes",
|
||||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||||
@@ -6191,6 +6448,24 @@
|
|||||||
"NXEngine"
|
"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",
|
"dest": "panafz1j.bin",
|
||||||
"sha1": "ec7ec62d60ec0459a14ed56ebc66761ef3c80efc",
|
"sha1": "ec7ec62d60ec0459a14ed56ebc66761ef3c80efc",
|
||||||
@@ -7439,6 +7714,15 @@
|
|||||||
"XRoar"
|
"XRoar"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "delta2.rom",
|
||||||
|
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||||
|
"size": 8192,
|
||||||
|
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||||
|
"cores": [
|
||||||
|
"XRoar"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "cp450dsk.rom",
|
"dest": "cp450dsk.rom",
|
||||||
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
||||||
|
|||||||
+308
-71
@@ -4,19 +4,234 @@
|
|||||||
"platform": "retrodeck",
|
"platform": "retrodeck",
|
||||||
"display_name": "RetroDECK",
|
"display_name": "RetroDECK",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"generated": "2026-04-01T14:43:08Z",
|
"generated": "2026-04-18T07:56:37Z",
|
||||||
"base_destination": "",
|
"base_destination": "",
|
||||||
"detect": [
|
"detect": [
|
||||||
{
|
{
|
||||||
"os": "linux",
|
"os": "linux",
|
||||||
"method": "path_exists",
|
"method": "path_exists",
|
||||||
"path": "$HOME/.var/app/net.retrodeck.retrodeck",
|
"path": "$HOME/.var/app/net.retrodeck.retrodeck",
|
||||||
"bios_path": "$HOME/retrodeck/bios"
|
"bios_path": "$HOME/retrodeck"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"standalone_copies": [],
|
"standalone_copies": [
|
||||||
"total_files": 3144,
|
{
|
||||||
"total_size": 5871582893,
|
"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": 3146,
|
||||||
|
"total_size": 6317707682,
|
||||||
"files": [
|
"files": [
|
||||||
{
|
{
|
||||||
"dest": "bios/panafz1.bin",
|
"dest": "bios/panafz1.bin",
|
||||||
@@ -11082,7 +11297,7 @@
|
|||||||
"dest": "bios/deltados.rom",
|
"dest": "bios/deltados.rom",
|
||||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||||
"size": 8192,
|
"size": 8192,
|
||||||
"repo_path": "bios/Dragon/Dragon/deltados.rom",
|
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||||
"cores": null
|
"cores": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -11477,6 +11692,13 @@
|
|||||||
"repo_path": "bios/Microsoft/MSX/openmsx/yrw801.rom",
|
"repo_path": "bios/Microsoft/MSX/openmsx/yrw801.rom",
|
||||||
"cores": null
|
"cores": null
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "bios/MSX2J.rom",
|
||||||
|
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||||
|
"size": 32768,
|
||||||
|
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
|
||||||
|
"cores": null
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "bios/MSX2R2.ROM",
|
"dest": "bios/MSX2R2.ROM",
|
||||||
"sha1": "04990aa1c3a3fc7294ec884b81deaa89832df614",
|
"sha1": "04990aa1c3a3fc7294ec884b81deaa89832df614",
|
||||||
@@ -13657,10 +13879,10 @@
|
|||||||
"cores": null
|
"cores": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"dest": "bios/VEC_MineStorm.vec",
|
"dest": "bios/VEC_Minestorm.vec",
|
||||||
"sha1": "65d07426b520ddd3115d40f255511e0fd2e20ae7",
|
"sha1": "65d07426b520ddd3115d40f255511e0fd2e20ae7",
|
||||||
"size": 8192,
|
"size": 8192,
|
||||||
"repo_path": "bios/GCE/Vectrex/VEC_MineStorm.vec",
|
"repo_path": "bios/GCE/Vectrex/VEC_Minestorm.vec",
|
||||||
"cores": null
|
"cores": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -16290,6 +16512,39 @@
|
|||||||
"storage": "release",
|
"storage": "release",
|
||||||
"release_asset": "vimana.zip"
|
"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",
|
"dest": "gamegenie.nes",
|
||||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||||
@@ -18256,6 +18511,24 @@
|
|||||||
"NXEngine"
|
"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",
|
"dest": "mda.rom",
|
||||||
"sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f",
|
"sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f",
|
||||||
@@ -20037,6 +20310,15 @@
|
|||||||
"SameBoy"
|
"SameBoy"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "sdlpal/desc.dat",
|
||||||
|
"sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba",
|
||||||
|
"size": 16027,
|
||||||
|
"repo_path": "bios/sdlpal/desc.dat",
|
||||||
|
"cores": [
|
||||||
|
"SDLPAL"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "SkyEmu/dmg_rom.bin",
|
"dest": "SkyEmu/dmg_rom.bin",
|
||||||
"sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
"sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||||
@@ -20154,69 +20436,6 @@
|
|||||||
"SquirrelJME"
|
"SquirrelJME"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"dest": "kvs1.wav",
|
|
||||||
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
|
||||||
"size": 3436329,
|
|
||||||
"repo_path": "bios/Atari/2600/KVS1.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvs2.wav",
|
|
||||||
"sha1": "8b83b2eea01b3e08ceb885aeb153d4084bddb63c",
|
|
||||||
"size": 2086275,
|
|
||||||
"repo_path": "bios/Atari/2600/KVS2.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvs3.wav",
|
|
||||||
"sha1": "86896a1e272d8715489de9b407f0b8a42f82d4a0",
|
|
||||||
"size": 3720920,
|
|
||||||
"repo_path": "bios/Atari/2600/KVS3.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvb1.wav",
|
|
||||||
"sha1": "6a582aebcefd6e2a97bdd8968202aab9851a889c",
|
|
||||||
"size": 4219542,
|
|
||||||
"repo_path": "bios/Atari/2600/KVB1.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvb2.wav",
|
|
||||||
"sha1": "60a425c6bde3226ab731995562716321be20fc49",
|
|
||||||
"size": 9593878,
|
|
||||||
"repo_path": "bios/Atari/2600/KVB2.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvb3.wav",
|
|
||||||
"sha1": "5e34125c4d6c209b21d1c892f3df0ec1644fd0d8",
|
|
||||||
"size": 7676992,
|
|
||||||
"repo_path": "bios/Atari/2600/KVB3.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dest": "kvshared.wav",
|
|
||||||
"sha1": "9adf10cdf1de833b194c7d8797ad1f041ad98dd3",
|
|
||||||
"size": 3059116,
|
|
||||||
"repo_path": "bios/Atari/2600/KVSHARED.WAV",
|
|
||||||
"cores": [
|
|
||||||
"Stella 2014"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"dest": "KVS1.WAV",
|
"dest": "KVS1.WAV",
|
||||||
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
"sha1": "b094c2c1fca81a0e531e0541f302346150ec4604",
|
||||||
@@ -21733,6 +21952,15 @@
|
|||||||
"XRoar"
|
"XRoar"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "delta2.rom",
|
||||||
|
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||||
|
"size": 8192,
|
||||||
|
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||||
|
"cores": [
|
||||||
|
"XRoar"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "cp450dsk.rom",
|
"dest": "cp450dsk.rom",
|
||||||
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
||||||
@@ -22300,6 +22528,15 @@
|
|||||||
"blueMSX"
|
"blueMSX"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"dest": "Machines/Shared Roms/MSX2J.rom",
|
||||||
|
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||||
|
"size": 32768,
|
||||||
|
"repo_path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
|
||||||
|
"cores": [
|
||||||
|
"blueMSX"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"dest": "Machines/Shared Roms/MSX2R2.ROM",
|
"dest": "Machines/Shared Roms/MSX2R2.ROM",
|
||||||
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
||||||
|
|||||||
+36
-3
@@ -4,7 +4,7 @@
|
|||||||
"platform": "romm",
|
"platform": "romm",
|
||||||
"display_name": "RomM",
|
"display_name": "RomM",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"generated": "2026-04-01T14:43:09Z",
|
"generated": "2026-04-02T13:53:45Z",
|
||||||
"base_destination": "bios",
|
"base_destination": "bios",
|
||||||
"detect": [
|
"detect": [
|
||||||
{
|
{
|
||||||
@@ -14,8 +14,8 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"standalone_copies": [],
|
"standalone_copies": [],
|
||||||
"total_files": 535,
|
"total_files": 538,
|
||||||
"total_size": 1076531155,
|
"total_size": 1556298731,
|
||||||
"files": [
|
"files": [
|
||||||
{
|
{
|
||||||
"dest": "3do/3do_arcade_saot.bin",
|
"dest": "3do/3do_arcade_saot.bin",
|
||||||
@@ -2796,6 +2796,39 @@
|
|||||||
"ep128emu-core"
|
"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",
|
"dest": "fds/gamegenie.nes",
|
||||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ theme:
|
|||||||
icon: material/brightness-4
|
icon: material/brightness-4
|
||||||
name: Switch to auto
|
name: Switch to auto
|
||||||
font: false
|
font: false
|
||||||
|
logo: assets/images/logo.png
|
||||||
|
favicon: assets/images/favicon.png
|
||||||
|
icon:
|
||||||
|
logo: material/chip
|
||||||
features:
|
features:
|
||||||
- navigation.tabs
|
- navigation.tabs
|
||||||
- navigation.sections
|
- navigation.sections
|
||||||
@@ -29,6 +33,8 @@ theme:
|
|||||||
- search.highlight
|
- search.highlight
|
||||||
- content.tabs.link
|
- content.tabs.link
|
||||||
- toc.follow
|
- toc.follow
|
||||||
|
extra_css:
|
||||||
|
- stylesheets/extra.css
|
||||||
markdown_extensions:
|
markdown_extensions:
|
||||||
- tables
|
- tables
|
||||||
- admonition
|
- admonition
|
||||||
@@ -48,6 +54,7 @@ plugins:
|
|||||||
- search
|
- search
|
||||||
nav:
|
nav:
|
||||||
- Home: index.md
|
- Home: index.md
|
||||||
|
- Download: which-pack.md
|
||||||
- Platforms:
|
- Platforms:
|
||||||
- Overview: platforms/index.md
|
- Overview: platforms/index.md
|
||||||
- Batocera: platforms/batocera.md
|
- Batocera: platforms/batocera.md
|
||||||
@@ -134,6 +141,7 @@ nav:
|
|||||||
- VTech: systems/vtech.md
|
- VTech: systems/vtech.md
|
||||||
- Vircon: systems/vircon.md
|
- Vircon: systems/vircon.md
|
||||||
- ZC: systems/zc.md
|
- ZC: systems/zc.md
|
||||||
|
- sdlpal: systems/sdlpal.md
|
||||||
- Emulators:
|
- Emulators:
|
||||||
- Overview: emulators/index.md
|
- Overview: emulators/index.md
|
||||||
- Official ports (63):
|
- Official ports (63):
|
||||||
@@ -475,4 +483,5 @@ nav:
|
|||||||
- Adding a scraper: wiki/adding-a-scraper.md
|
- Adding a scraper: wiki/adding-a-scraper.md
|
||||||
- Testing guide: wiki/testing-guide.md
|
- Testing guide: wiki/testing-guide.md
|
||||||
- Release process: wiki/release-process.md
|
- Release process: wiki/release-process.md
|
||||||
|
- Community tools: wiki/community-tools.md
|
||||||
- Contributing: contributing.md
|
- Contributing: contributing.md
|
||||||
|
|||||||
@@ -150,22 +150,23 @@ data_directories:
|
|||||||
description: "SDLPAL Chinese Paladin game data (.mkf archives)"
|
description: "SDLPAL Chinese Paladin game data (.mkf archives)"
|
||||||
|
|
||||||
# ref: OpenTyrian2000 — system/opentyrian/tyrian/
|
# 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:
|
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
|
source_type: zip
|
||||||
for_platforms: [retroarch, lakka, retropie]
|
for_platforms: [retroarch, lakka, retropie]
|
||||||
local_cache: data/opentyrian
|
local_cache: data/opentyrian
|
||||||
description: "OpenTyrian Tyrian 2.1 freeware game data"
|
description: "OpenTyrian Tyrian 2.1 freeware game data"
|
||||||
|
|
||||||
# ref: syobonaction — system/syobonaction/
|
# ref: syobonaction — system/syobonaction/
|
||||||
# Freeware game data from OpenSyobonAction
|
# Freeware game data from OpenSyobonAction (BGM, res, SE directories)
|
||||||
syobonaction:
|
syobonaction:
|
||||||
source_url: "https://github.com/akemin-dayo/OpenSyobonAction"
|
source_url: "https://github.com/akemin-dayo/OpenSyobonAction/archive/refs/heads/{version}.tar.gz"
|
||||||
source_type: git_subtree
|
source_type: tarball
|
||||||
source_path: "res"
|
source_path: "OpenSyobonAction-master"
|
||||||
version: master
|
version: master
|
||||||
local_cache: data/syobonaction
|
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)"
|
description: "Syobon Action (Cat Mario) game data (sprites, BGM, SE)"
|
||||||
|
|
||||||
# =========================================================================
|
# =========================================================================
|
||||||
@@ -190,9 +191,10 @@ data_directories:
|
|||||||
# Not on buildbot — sourced from libretro repo
|
# Not on buildbot — sourced from libretro repo
|
||||||
# 532 files (tiles, fonts, databases, lua scripts, level descriptions)
|
# 532 files (tiles, fonts, databases, lua scripts, level descriptions)
|
||||||
stonesoup:
|
stonesoup:
|
||||||
source_url: "https://github.com/libretro/crawl-ref"
|
source_url: "https://github.com/libretro/crawl-ref/archive/refs/heads/{version}.tar.gz"
|
||||||
source_type: git_subtree
|
source_type: tarball
|
||||||
source_path: "crawl-ref/source/dat"
|
source_path: "crawl-ref-master/crawl-ref/source/dat"
|
||||||
|
version: master
|
||||||
local_cache: data/stonesoup
|
local_cache: data/stonesoup
|
||||||
description: "DCSS game data (tiles, fonts, databases, lua, level descriptions)"
|
description: "DCSS game data (tiles, fonts, databases, lua, level descriptions)"
|
||||||
|
|
||||||
|
|||||||
+825
-3
@@ -32,6 +32,144 @@ platforms:
|
|||||||
method: config_file
|
method: config_file
|
||||||
config: '%APPDATA%\RetroArch\retroarch.cfg'
|
config: '%APPDATA%\RetroArch\retroarch.cfg'
|
||||||
parse_key: system_directory
|
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:
|
batocera:
|
||||||
config: batocera.yml
|
config: batocera.yml
|
||||||
status: active
|
status: active
|
||||||
@@ -256,6 +394,144 @@ platforms:
|
|||||||
method: file_exists
|
method: file_exists
|
||||||
file: /etc/batocera-version
|
file: /etc/batocera-version
|
||||||
bios_path: /userdata/bios
|
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:
|
recalbox:
|
||||||
config: recalbox.yml
|
config: recalbox.yml
|
||||||
status: active
|
status: active
|
||||||
@@ -468,6 +744,144 @@ platforms:
|
|||||||
method: file_exists
|
method: file_exists
|
||||||
file: /usr/bin/recalbox-settings
|
file: /usr/bin/recalbox-settings
|
||||||
bios_path: /recalbox/share/bios
|
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:
|
retrobat:
|
||||||
config: retrobat.yml
|
config: retrobat.yml
|
||||||
status: active
|
status: active
|
||||||
@@ -653,6 +1067,144 @@ platforms:
|
|||||||
- os: windows
|
- os: windows
|
||||||
method: path_exists
|
method: path_exists
|
||||||
path: '%USERPROFILE%\RetroBat\bios'
|
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:
|
emudeck:
|
||||||
config: emudeck.yml
|
config: emudeck.yml
|
||||||
status: active
|
status: active
|
||||||
@@ -681,19 +1233,143 @@ platforms:
|
|||||||
parse_key: $emulationPath
|
parse_key: $emulationPath
|
||||||
bios_subdir: bios
|
bios_subdir: bios
|
||||||
standalone_copies:
|
standalone_copies:
|
||||||
|
# Switch emulators (keys)
|
||||||
- file: prod.keys
|
- file: prod.keys
|
||||||
targets:
|
targets:
|
||||||
linux:
|
linux:
|
||||||
- $HOME/.local/share/yuzu/keys
|
- $HOME/.local/share/yuzu/keys
|
||||||
- $HOME/.local/share/eden/keys
|
- $HOME/.local/share/eden/keys
|
||||||
|
- $HOME/.local/share/citron/keys
|
||||||
|
- $HOME/.local/share/suyu/keys
|
||||||
- $HOME/.config/Ryujinx/system
|
- $HOME/.config/Ryujinx/system
|
||||||
windows:
|
windows:
|
||||||
- '%APPDATA%\yuzu\keys'
|
- '%APPDATA%\yuzu\keys'
|
||||||
- '%APPDATA%\eden\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:
|
targets:
|
||||||
linux:
|
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:
|
lakka:
|
||||||
config: lakka.yml
|
config: lakka.yml
|
||||||
status: active
|
status: active
|
||||||
@@ -719,6 +1395,10 @@ platforms:
|
|||||||
source_format: github_component_manifests
|
source_format: github_component_manifests
|
||||||
hash_type: md5
|
hash_type: md5
|
||||||
schedule: monthly
|
schedule: monthly
|
||||||
|
contributed_by:
|
||||||
|
- username: monster-penguin
|
||||||
|
contribution: platform support
|
||||||
|
pr: 36
|
||||||
cores:
|
cores:
|
||||||
- azahar
|
- azahar
|
||||||
- cemu
|
- cemu
|
||||||
@@ -748,7 +1428,145 @@ platforms:
|
|||||||
- os: linux
|
- os: linux
|
||||||
method: path_exists
|
method: path_exists
|
||||||
path: $HOME/.var/app/net.retrodeck.retrodeck
|
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:
|
romm:
|
||||||
config: romm.yml
|
config: romm.yml
|
||||||
status: active
|
status: active
|
||||||
@@ -758,6 +1576,10 @@ platforms:
|
|||||||
source_format: json
|
source_format: json
|
||||||
hash_type: sha1
|
hash_type: sha1
|
||||||
schedule: monthly
|
schedule: monthly
|
||||||
|
contributed_by:
|
||||||
|
- username: PixNyb
|
||||||
|
contribution: platform support
|
||||||
|
pr: 37
|
||||||
inherits_from: emulatorjs
|
inherits_from: emulatorjs
|
||||||
target_scraper: null
|
target_scraper: null
|
||||||
target_source: null
|
target_source: null
|
||||||
|
|||||||
@@ -7978,8 +7978,8 @@ systems:
|
|||||||
- name: Vectrex_Bios.bin
|
- name: Vectrex_Bios.bin
|
||||||
destination: bios/Vectrex_Bios.bin
|
destination: bios/Vectrex_Bios.bin
|
||||||
required: false
|
required: false
|
||||||
- name: VEC_MineStorm.vec
|
- name: VEC_Minestorm.vec
|
||||||
destination: bios/VEC_MineStorm.vec
|
destination: bios/VEC_Minestorm.vec
|
||||||
required: false
|
required: false
|
||||||
vsmile:
|
vsmile:
|
||||||
files:
|
files:
|
||||||
|
|||||||
+1
-3
@@ -743,15 +743,13 @@ def group_identical_platforms(
|
|||||||
inherits[platform] = False
|
inherits[platform] = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
base_dest = config.get("base_destination", "")
|
|
||||||
entries = []
|
entries = []
|
||||||
for sys_id, system in sorted(config.get("systems", {}).items()):
|
for sys_id, system in sorted(config.get("systems", {}).items()):
|
||||||
for fe in system.get("files", []):
|
for fe in system.get("files", []):
|
||||||
dest = fe.get("destination", fe.get("name", ""))
|
dest = fe.get("destination", fe.get("name", ""))
|
||||||
full_dest = f"{base_dest}/{dest}" if base_dest else dest
|
|
||||||
sha1 = fe.get("sha1", "")
|
sha1 = fe.get("sha1", "")
|
||||||
md5 = fe.get("md5", "")
|
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()
|
fp = hashlib.sha1("|".join(sorted(entries)).encode()).hexdigest()
|
||||||
if target_cores_cache:
|
if target_cores_cache:
|
||||||
|
|||||||
+184
-51
@@ -103,32 +103,55 @@ def _build_supplemental_index(
|
|||||||
return names
|
return names
|
||||||
|
|
||||||
|
|
||||||
def _find_in_repo(
|
def _resolve_source(
|
||||||
fname: str,
|
fname: str,
|
||||||
by_name: dict[str, list],
|
by_name: dict[str, list],
|
||||||
by_name_lower: dict[str, str],
|
by_name_lower: dict[str, str],
|
||||||
data_names: set[str] | None = None,
|
data_names: set[str] | None = None,
|
||||||
) -> bool:
|
by_path_suffix: dict | None = None,
|
||||||
|
) -> str | None:
|
||||||
|
"""Return the source category for a file, or None if not found.
|
||||||
|
|
||||||
|
Returns ``"bios"`` (in database.json / bios/), ``"data"`` (in data/),
|
||||||
|
or ``None`` (not available anywhere).
|
||||||
|
"""
|
||||||
|
# bios/ via database.json by_name
|
||||||
if fname in by_name:
|
if fname in by_name:
|
||||||
return True
|
return "bios"
|
||||||
# For directory entries or paths, extract the meaningful basename
|
|
||||||
stripped = fname.rstrip("/")
|
stripped = fname.rstrip("/")
|
||||||
basename = stripped.rsplit("/", 1)[-1] if "/" in stripped else None
|
basename = stripped.rsplit("/", 1)[-1] if "/" in stripped else None
|
||||||
if basename and basename in by_name:
|
if basename and basename in by_name:
|
||||||
return True
|
return "bios"
|
||||||
key = fname.lower()
|
key = fname.lower()
|
||||||
if key in by_name_lower:
|
if key in by_name_lower:
|
||||||
return True
|
return "bios"
|
||||||
if basename:
|
if basename:
|
||||||
key = basename.lower()
|
if basename.lower() in by_name_lower:
|
||||||
if key in by_name_lower:
|
return "bios"
|
||||||
return True
|
# bios/ via by_path_suffix (regional variants)
|
||||||
|
if by_path_suffix and fname in by_path_suffix:
|
||||||
|
return "bios"
|
||||||
|
# data/ supplemental index
|
||||||
if data_names:
|
if data_names:
|
||||||
if fname in data_names or key in data_names:
|
if fname in data_names or key in data_names:
|
||||||
return True
|
return "data"
|
||||||
if basename and (basename in data_names or basename.lower() in data_names):
|
if basename and (basename in data_names or basename.lower() in data_names):
|
||||||
return True
|
return "data"
|
||||||
return False
|
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(
|
def cross_reference(
|
||||||
@@ -137,88 +160,184 @@ def cross_reference(
|
|||||||
db: dict,
|
db: dict,
|
||||||
platform_data_dirs: dict[str, set[str]] | None = None,
|
platform_data_dirs: dict[str, set[str]] | None = None,
|
||||||
data_names: set[str] | None = None,
|
data_names: set[str] | None = None,
|
||||||
|
all_declared: set[str] | None = None,
|
||||||
) -> dict:
|
) -> dict:
|
||||||
"""Compare emulator profiles against platform declarations.
|
"""Compare emulator profiles against platform declarations.
|
||||||
|
|
||||||
Returns a report with gaps (files emulators need but platforms don't list)
|
Returns a report with gaps (files emulators need but platforms don't list)
|
||||||
and coverage stats. Files covered by matching data_directories between
|
and coverage stats. Each gap entry carries a ``source`` field indicating
|
||||||
emulator profile and platform config are not reported as gaps.
|
where the file is available: ``"bios"`` (bios/ via database.json),
|
||||||
Checks both bios/ (via database) and data/ (via data_names index).
|
``"data"`` (data/ directory), ``"large_file"`` (GitHub release asset),
|
||||||
|
or ``"missing"`` (not available anywhere).
|
||||||
|
|
||||||
|
The boolean ``in_repo`` is derived: ``source != "missing"``.
|
||||||
|
|
||||||
|
When *all_declared* is provided (flat set of every filename declared by
|
||||||
|
any platform for any system), it is used for the ``in_platform`` check
|
||||||
|
instead of the per-system lookup. This is appropriate for the global
|
||||||
|
gap analysis page where "undeclared" means "no platform declares it at all".
|
||||||
"""
|
"""
|
||||||
platform_data_dirs = platform_data_dirs or {}
|
platform_data_dirs = platform_data_dirs or {}
|
||||||
by_name = db.get("indexes", {}).get("by_name", {})
|
by_name = db.get("indexes", {}).get("by_name", {})
|
||||||
by_name_lower = {k.lower(): k for k in by_name}
|
by_name_lower = {k.lower(): k for k in by_name}
|
||||||
|
by_md5 = db.get("indexes", {}).get("by_md5", {})
|
||||||
|
by_path_suffix = db.get("indexes", {}).get("by_path_suffix", {})
|
||||||
|
db_files = db.get("files", {})
|
||||||
report = {}
|
report = {}
|
||||||
|
|
||||||
for emu_name, profile in profiles.items():
|
for emu_name, profile in profiles.items():
|
||||||
emu_files = profile.get("files", [])
|
emu_files = profile.get("files", [])
|
||||||
systems = profile.get("systems", [])
|
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:
|
||||||
platform_names = set()
|
platform_names = set()
|
||||||
for sys_id in systems:
|
for sys_id in systems:
|
||||||
platform_names.update(declared.get(sys_id, set()))
|
platform_names.update(declared.get(sys_id, set()))
|
||||||
|
|
||||||
gaps = []
|
gaps = []
|
||||||
covered = []
|
covered = []
|
||||||
by_md5 = db.get("indexes", {}).get("by_md5", {})
|
unsourceable_list: list[dict] = []
|
||||||
|
archive_gaps: dict[str, dict] = {}
|
||||||
|
seen_files: set[str] = set()
|
||||||
for f in emu_files:
|
for f in emu_files:
|
||||||
fname = f.get("name", "")
|
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
|
continue
|
||||||
|
|
||||||
# Skip pattern placeholders (e.g., <bios>.bin, <user-selected>.bin)
|
# 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
|
continue
|
||||||
|
|
||||||
# Skip UI-imported files with explicit path: null (not resolvable by pack)
|
# Skip UI-imported files with explicit path: null (not resolvable by pack)
|
||||||
if "path" in f and f["path"] is None:
|
if "path" in f and f["path"] is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Skip release asset files (stored in GitHub releases, not bios/)
|
|
||||||
if f.get("storage") == "release":
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Skip standalone-only files
|
# Skip standalone-only files
|
||||||
file_mode = f.get("mode", "both")
|
file_mode = f.get("mode", "both")
|
||||||
if file_mode == "standalone":
|
if file_mode == "standalone":
|
||||||
continue
|
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
|
in_platform = fname in platform_names
|
||||||
in_repo = _find_in_repo(fname, by_name, by_name_lower, data_names)
|
if not in_platform and archive:
|
||||||
if not in_repo:
|
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"):
|
||||||
|
source = "large_file"
|
||||||
|
else:
|
||||||
|
source = _resolve_source(
|
||||||
|
fname, by_name, by_name_lower, data_names, by_path_suffix
|
||||||
|
)
|
||||||
|
if source is None:
|
||||||
path_field = f.get("path", "")
|
path_field = f.get("path", "")
|
||||||
if path_field and path_field != fname:
|
if path_field and path_field != fname:
|
||||||
in_repo = _find_in_repo(
|
source = _resolve_source(
|
||||||
path_field, by_name, by_name_lower, data_names
|
path_field, by_name, by_name_lower,
|
||||||
|
data_names, by_path_suffix,
|
||||||
)
|
)
|
||||||
# Try MD5 hash match (handles files that exist under different names)
|
# Try MD5 hash match
|
||||||
if not in_repo:
|
if source is None:
|
||||||
md5_raw = f.get("md5", "")
|
md5_raw = f.get("md5", "")
|
||||||
if md5_raw:
|
if md5_raw:
|
||||||
for md5_val in md5_raw.split(","):
|
for md5_val in md5_raw.split(","):
|
||||||
md5_val = md5_val.strip().lower()
|
md5_val = md5_val.strip().lower()
|
||||||
if md5_val and by_md5.get(md5_val):
|
if md5_val and by_md5.get(md5_val):
|
||||||
in_repo = True
|
source = "bios"
|
||||||
break
|
break
|
||||||
# Try SHA1 hash match
|
# Try SHA1 hash match
|
||||||
if not in_repo:
|
if source is None:
|
||||||
sha1 = f.get("sha1", "")
|
sha1 = f.get("sha1", "")
|
||||||
if sha1 and sha1 in db.get("files", {}):
|
if sha1 and sha1 in db_files:
|
||||||
in_repo = True
|
source = "bios"
|
||||||
|
if source is None:
|
||||||
|
source = "missing"
|
||||||
|
|
||||||
|
in_repo = source != "missing"
|
||||||
|
|
||||||
entry = {
|
entry = {
|
||||||
"name": fname,
|
"name": fname,
|
||||||
"required": f.get("required", False),
|
"required": f.get("required", False),
|
||||||
"note": f.get("note", ""),
|
"note": f.get("note", ""),
|
||||||
"source_ref": f.get("source_ref", ""),
|
"source_ref": f.get("source_ref", ""),
|
||||||
"in_platform": in_platform,
|
"in_platform": False,
|
||||||
"in_repo": in_repo,
|
"in_repo": in_repo,
|
||||||
|
"source": source,
|
||||||
}
|
}
|
||||||
|
|
||||||
if not in_platform:
|
|
||||||
gaps.append(entry)
|
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] = {
|
report[emu_name] = {
|
||||||
"emulator": profile.get("emulator", emu_name),
|
"emulator": profile.get("emulator", emu_name),
|
||||||
@@ -227,8 +346,12 @@ def cross_reference(
|
|||||||
"platform_covered": len(covered),
|
"platform_covered": len(covered),
|
||||||
"gaps": len(gaps),
|
"gaps": len(gaps),
|
||||||
"gap_in_repo": sum(1 for g in gaps if g["in_repo"]),
|
"gap_in_repo": sum(1 for g in gaps if g["in_repo"]),
|
||||||
"gap_missing": sum(1 for g in gaps if not g["in_repo"]),
|
"gap_missing": sum(1 for g in gaps if g["source"] == "missing"),
|
||||||
|
"gap_bios": sum(1 for g in gaps if g["source"] == "bios"),
|
||||||
|
"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,
|
"gap_details": gaps,
|
||||||
|
"unsourceable": unsourceable_list,
|
||||||
}
|
}
|
||||||
|
|
||||||
return report
|
return report
|
||||||
@@ -240,15 +363,19 @@ def print_report(report: dict) -> None:
|
|||||||
print("=" * 60)
|
print("=" * 60)
|
||||||
|
|
||||||
total_gaps = 0
|
total_gaps = 0
|
||||||
total_in_repo = 0
|
totals: dict[str, int] = {"bios": 0, "data": 0, "large_file": 0, "missing": 0}
|
||||||
total_missing = 0
|
|
||||||
|
|
||||||
for emu_name, data in sorted(report.items()):
|
for emu_name, data in sorted(report.items()):
|
||||||
gaps = data["gaps"]
|
gaps = data["gaps"]
|
||||||
if gaps == 0:
|
if gaps == 0:
|
||||||
status = "OK"
|
continue
|
||||||
else:
|
|
||||||
status = f"{data['gap_in_repo']} in repo, {data['gap_missing']} missing"
|
parts = []
|
||||||
|
for key in ("bios", "data", "large_file", "missing"):
|
||||||
|
count = data.get(f"gap_{key}", 0)
|
||||||
|
if count:
|
||||||
|
parts.append(f"{count} {key}")
|
||||||
|
status = ", ".join(parts) if parts else "OK"
|
||||||
|
|
||||||
print(f"\n{data['emulator']} ({', '.join(data['systems'])})")
|
print(f"\n{data['emulator']} ({', '.join(data['systems'])})")
|
||||||
print(
|
print(
|
||||||
@@ -256,23 +383,29 @@ def print_report(report: dict) -> None:
|
|||||||
f"{data['platform_covered']} declared by platforms, "
|
f"{data['platform_covered']} declared by platforms, "
|
||||||
f"{gaps} undeclared"
|
f"{gaps} undeclared"
|
||||||
)
|
)
|
||||||
|
|
||||||
if gaps > 0:
|
|
||||||
print(f" Gaps: {status}")
|
print(f" Gaps: {status}")
|
||||||
|
|
||||||
for g in data["gap_details"]:
|
for g in data["gap_details"]:
|
||||||
req = "*" if g["required"] else " "
|
req = "*" if g["required"] else " "
|
||||||
loc = "repo" if g["in_repo"] else "MISSING"
|
src = g.get("source", "missing").upper()
|
||||||
note = f" -- {g['note']}" if g["note"] else ""
|
note = f" -- {g['note']}" if g["note"] else ""
|
||||||
print(f" {req} {g['name']} [{loc}]{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
|
total_gaps += gaps
|
||||||
total_in_repo += data["gap_in_repo"]
|
for key in totals:
|
||||||
total_missing += data["gap_missing"]
|
totals[key] += data.get(f"gap_{key}", 0)
|
||||||
|
|
||||||
print(f"\n{'=' * 60}")
|
print(f"\n{'=' * 60}")
|
||||||
print(f"Total: {total_gaps} undeclared files across all emulators")
|
print(f"Total: {total_gaps} undeclared files across all emulators")
|
||||||
print(f" {total_in_repo} already in repo (can be added to packs)")
|
available = totals["bios"] + totals["data"] + totals["large_file"]
|
||||||
print(f" {total_missing} missing from repo (need to be sourced)")
|
print(f" {available} available (bios: {totals['bios']}, data: {totals['data']}, "
|
||||||
|
f"large_file: {totals['large_file']})")
|
||||||
|
print(f" {totals['missing']} missing (need to be sourced)")
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|||||||
@@ -168,6 +168,7 @@ def build_indexes(files: dict, aliases: dict) -> dict:
|
|||||||
by_md5 = {}
|
by_md5 = {}
|
||||||
by_name = {}
|
by_name = {}
|
||||||
by_crc32 = {}
|
by_crc32 = {}
|
||||||
|
by_sha256 = {}
|
||||||
by_path_suffix = {}
|
by_path_suffix = {}
|
||||||
|
|
||||||
for sha1, entry in files.items():
|
for sha1, entry in files.items():
|
||||||
@@ -179,6 +180,7 @@ def build_indexes(files: dict, aliases: dict) -> dict:
|
|||||||
by_name[name].append(sha1)
|
by_name[name].append(sha1)
|
||||||
|
|
||||||
by_crc32[entry["crc32"]] = sha1
|
by_crc32[entry["crc32"]] = sha1
|
||||||
|
by_sha256[entry["sha256"]] = sha1
|
||||||
|
|
||||||
# Path suffix index for regional variant resolution
|
# Path suffix index for regional variant resolution
|
||||||
suffix = _path_suffix(entry["path"])
|
suffix = _path_suffix(entry["path"])
|
||||||
@@ -208,6 +210,7 @@ def build_indexes(files: dict, aliases: dict) -> dict:
|
|||||||
"by_md5": by_md5,
|
"by_md5": by_md5,
|
||||||
"by_name": by_name,
|
"by_name": by_name,
|
||||||
"by_crc32": by_crc32,
|
"by_crc32": by_crc32,
|
||||||
|
"by_sha256": by_sha256,
|
||||||
"by_path_suffix": by_path_suffix,
|
"by_path_suffix": by_path_suffix,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+83
-50
@@ -246,6 +246,13 @@ def _register_path(dest: str, seen_files: set[str], seen_parents: set[str]) -> N
|
|||||||
seen_parents.add(parent)
|
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(
|
def resolve_file(
|
||||||
file_entry: dict,
|
file_entry: dict,
|
||||||
db: dict,
|
db: dict,
|
||||||
@@ -758,6 +765,7 @@ def _build_readme(
|
|||||||
total_files: int,
|
total_files: int,
|
||||||
num_systems: int,
|
num_systems: int,
|
||||||
source: str = "full",
|
source: str = "full",
|
||||||
|
contributors: list[dict] | None = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""Build a personalized step-by-step README for each platform pack."""
|
"""Build a personalized step-by-step README for each platform pack."""
|
||||||
sep = "=" * 50
|
sep = "=" * 50
|
||||||
@@ -782,15 +790,14 @@ def _build_readme(
|
|||||||
" 1. Find your RetroArch system directory:\n"
|
" 1. Find your RetroArch system directory:\n"
|
||||||
" - RetroArch > Settings > Directory > System/BIOS\n"
|
" - RetroArch > Settings > Directory > System/BIOS\n"
|
||||||
" - Default: retroarch/system/\n"
|
" - Default: retroarch/system/\n"
|
||||||
' 2. Open the "system" folder from this archive\n'
|
" 2. Extract all files from this archive directly into your system directory\n"
|
||||||
" 3. Copy ALL contents into your system directory\n"
|
" 3. Overwrite if asked\n\n"
|
||||||
" 4. Overwrite if asked\n\n"
|
|
||||||
" Option C: Manual (handheld / SD card)\n"
|
" Option C: Manual (handheld / SD card)\n"
|
||||||
" -------------------------------------\n"
|
" -------------------------------------\n"
|
||||||
" Anbernic, Retroid, Miyoo, Trimui, etc.:\n"
|
" Anbernic, Retroid, Miyoo, Trimui, etc.:\n"
|
||||||
" 1. Connect your SD card to your PC\n"
|
" 1. Connect your SD card to your PC\n"
|
||||||
" 2. Find the BIOS folder (usually BIOS/ or system/)\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"
|
" 4. Eject SD card and reboot your device\n\n"
|
||||||
" Common paths by device:\n"
|
" Common paths by device:\n"
|
||||||
" Anbernic (ArkOS/JELOS): BIOS/\n"
|
" Anbernic (ArkOS/JELOS): BIOS/\n"
|
||||||
@@ -809,14 +816,13 @@ def _build_readme(
|
|||||||
" 1. On your PC, open the Batocera network share:\n"
|
" 1. On your PC, open the Batocera network share:\n"
|
||||||
" - Windows: \\\\BATOCERA\\share\\bios\\\n"
|
" - Windows: \\\\BATOCERA\\share\\bios\\\n"
|
||||||
" - Mac/Linux: smb://batocera/share/bios/\n"
|
" - Mac/Linux: smb://batocera/share/bios/\n"
|
||||||
' 2. Open the "bios" folder from this archive\n'
|
" 2. Extract all files from this archive directly into the share\n"
|
||||||
" 3. Copy ALL contents into the share\n"
|
" 3. Overwrite if asked\n\n"
|
||||||
" 4. Overwrite if asked\n\n"
|
|
||||||
" Option C: Manual (SD card)\n"
|
" Option C: Manual (SD card)\n"
|
||||||
" --------------------------\n"
|
" --------------------------\n"
|
||||||
" 1. Put the SD card in your PC\n"
|
" 1. Put the SD card in your PC\n"
|
||||||
" 2. Navigate to /userdata/bios/ on the SHARE partition\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"
|
" NOTE: Dreamcast flash memory is named dc_nvmem.bin\n"
|
||||||
" (if your setup asks for dc_flash.bin, same file).\n\n"
|
" (if your setup asks for dc_flash.bin, same file).\n\n"
|
||||||
),
|
),
|
||||||
@@ -830,13 +836,12 @@ def _build_readme(
|
|||||||
" 1. On your PC, open the Recalbox network share:\n"
|
" 1. On your PC, open the Recalbox network share:\n"
|
||||||
" - Windows: \\\\RECALBOX\\share\\bios\\\n"
|
" - Windows: \\\\RECALBOX\\share\\bios\\\n"
|
||||||
" - Mac/Linux: smb://recalbox/share/bios/\n"
|
" - Mac/Linux: smb://recalbox/share/bios/\n"
|
||||||
' 2. Open the "bios" folder from this archive\n'
|
" 2. Extract all files from this archive directly into the share\n\n"
|
||||||
" 3. Copy ALL contents into the share\n\n"
|
|
||||||
" Option C: Manual (SD card)\n"
|
" Option C: Manual (SD card)\n"
|
||||||
" --------------------------\n"
|
" --------------------------\n"
|
||||||
" 1. Put the SD card in your PC\n"
|
" 1. Put the SD card in your PC\n"
|
||||||
" 2. Navigate to /recalbox/share/bios/\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": (
|
"emudeck": (
|
||||||
"INSTALLATION GUIDE (Steam Deck / Linux)\n\n"
|
"INSTALLATION GUIDE (Steam Deck / Linux)\n\n"
|
||||||
@@ -850,8 +855,7 @@ def _build_readme(
|
|||||||
" ----------------\n"
|
" ----------------\n"
|
||||||
" 1. Open Dolphin file manager\n"
|
" 1. Open Dolphin file manager\n"
|
||||||
" 2. Navigate to ~/Emulation/bios/\n"
|
" 2. Navigate to ~/Emulation/bios/\n"
|
||||||
' 3. Open the "bios" folder from this archive\n'
|
" 3. Extract all files from this archive directly into ~/Emulation/bios/\n\n"
|
||||||
" 4. Copy ALL contents into ~/Emulation/bios/\n\n"
|
|
||||||
" STANDALONE EMULATORS (extra step)\n"
|
" STANDALONE EMULATORS (extra step)\n"
|
||||||
" Switch and 3DS emulators need keys in specific folders:\n"
|
" Switch and 3DS emulators need keys in specific folders:\n"
|
||||||
" prod.keys -> ~/.local/share/yuzu/keys/\n"
|
" prod.keys -> ~/.local/share/yuzu/keys/\n"
|
||||||
@@ -870,11 +874,8 @@ def _build_readme(
|
|||||||
" ----------------\n"
|
" ----------------\n"
|
||||||
" 1. Open Dolphin file manager\n"
|
" 1. Open Dolphin file manager\n"
|
||||||
" 2. Show hidden files (Ctrl+H)\n"
|
" 2. Show hidden files (Ctrl+H)\n"
|
||||||
" 3. Navigate to ~/retrodeck/\n"
|
" 3. Navigate to ~/retrodeck/bios/\n"
|
||||||
' 4. Open the "bios" folder from this archive\n'
|
" 4. Extract all files from this archive directly into ~/retrodeck/bios/\n\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"
|
|
||||||
" NOTE: RetroDECK uses its own BIOS checker. After\n"
|
" NOTE: RetroDECK uses its own BIOS checker. After\n"
|
||||||
" copying, open RetroDECK > Tools > BIOS Checker to\n"
|
" copying, open RetroDECK > Tools > BIOS Checker to\n"
|
||||||
" verify everything is detected.\n\n"
|
" verify everything is detected.\n\n"
|
||||||
@@ -890,9 +891,8 @@ def _build_readme(
|
|||||||
" 1. Open your RetroBat installation folder\n"
|
" 1. Open your RetroBat installation folder\n"
|
||||||
" 2. Navigate to the bios\\ subfolder\n"
|
" 2. Navigate to the bios\\ subfolder\n"
|
||||||
" (default: C:\\RetroBat\\bios\\)\n"
|
" (default: C:\\RetroBat\\bios\\)\n"
|
||||||
' 3. Open the "bios" folder from this archive\n'
|
" 3. Extract all files from this archive directly into your bios\\ folder\n"
|
||||||
" 4. Copy ALL contents into your bios\\ folder\n"
|
" 4. Overwrite if asked\n\n"
|
||||||
" 5. Overwrite if asked\n\n"
|
|
||||||
),
|
),
|
||||||
"bizhawk": (
|
"bizhawk": (
|
||||||
"INSTALLATION GUIDE\n\n"
|
"INSTALLATION GUIDE\n\n"
|
||||||
@@ -900,16 +900,15 @@ def _build_readme(
|
|||||||
" 2. Navigate to the Firmware subfolder:\n"
|
" 2. Navigate to the Firmware subfolder:\n"
|
||||||
" - Windows: BizHawk\\Firmware\\\n"
|
" - Windows: BizHawk\\Firmware\\\n"
|
||||||
" - Linux: ~/.config/BizHawk/Firmware/\n"
|
" - Linux: ~/.config/BizHawk/Firmware/\n"
|
||||||
' 3. Open the "Firmware" folder from this archive\n'
|
" 3. Extract all files from this archive directly into your Firmware folder\n"
|
||||||
" 4. Copy ALL contents into your Firmware folder\n"
|
" 4. In BizHawk: Config > Paths > Firmware should\n"
|
||||||
" 5. In BizHawk: Config > Paths > Firmware should\n"
|
|
||||||
" point to this folder\n\n"
|
" point to this folder\n\n"
|
||||||
),
|
),
|
||||||
"romm": (
|
"romm": (
|
||||||
"INSTALLATION GUIDE (RomM server)\n\n"
|
"INSTALLATION GUIDE (RomM server)\n\n"
|
||||||
" 1. Locate your RomM library folder\n"
|
" 1. Locate your RomM library folder\n"
|
||||||
" 2. Navigate to the bios/ subdirectory\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"
|
" 4. Restart the RomM service to detect new files\n\n"
|
||||||
),
|
),
|
||||||
"retropie": (
|
"retropie": (
|
||||||
@@ -917,7 +916,7 @@ def _build_readme(
|
|||||||
" Option A: Via network share\n"
|
" Option A: Via network share\n"
|
||||||
" --------------------------\n"
|
" --------------------------\n"
|
||||||
" 1. On your PC, open: \\\\RETROPIE\\bios\\\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"
|
" Option B: Via SSH\n"
|
||||||
" -----------------\n"
|
" -----------------\n"
|
||||||
" 1. SSH into your Pi: ssh pi@retropie\n"
|
" 1. SSH into your Pi: ssh pi@retropie\n"
|
||||||
@@ -926,7 +925,7 @@ def _build_readme(
|
|||||||
" ---------------------\n"
|
" ---------------------\n"
|
||||||
" 1. Put the SD card in your PC\n"
|
" 1. Put the SD card in your PC\n"
|
||||||
" 2. Navigate to /home/pi/RetroPie/BIOS/\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"
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -937,9 +936,8 @@ def _build_readme(
|
|||||||
platform_name,
|
platform_name,
|
||||||
(
|
(
|
||||||
f"INSTALLATION\n\n"
|
f"INSTALLATION\n\n"
|
||||||
f' 1. Open the "{base_dest or "files"}" folder in this archive\n'
|
f" 1. Extract all files from this archive directly into your BIOS directory\n"
|
||||||
f" 2. Copy ALL contents to your BIOS directory\n"
|
f" 2. Overwrite if asked\n\n"
|
||||||
f" 3. Overwrite if asked\n\n"
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -971,7 +969,15 @@ def _build_readme(
|
|||||||
" Independent of platform scraper accuracy.\n\n"
|
" Independent of platform scraper accuracy.\n\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
return header + source_info + guide + footer
|
credits = ""
|
||||||
|
if contributors:
|
||||||
|
credits = "\nCONTRIBUTORS\n\n"
|
||||||
|
for cb in contributors:
|
||||||
|
username = cb.get("username", "")
|
||||||
|
credits += f" @{username}\n"
|
||||||
|
credits += "\n"
|
||||||
|
|
||||||
|
return header + source_info + guide + credits + footer
|
||||||
|
|
||||||
|
|
||||||
def _build_agnostic_rename_readme(
|
def _build_agnostic_rename_readme(
|
||||||
@@ -1010,6 +1016,7 @@ def generate_pack(
|
|||||||
system_filter: list[str] | None = None,
|
system_filter: list[str] | None = None,
|
||||||
precomputed_extras: list[dict] | None = None,
|
precomputed_extras: list[dict] | None = None,
|
||||||
source: str = "full",
|
source: str = "full",
|
||||||
|
flatten: bool = True,
|
||||||
) -> str | None:
|
) -> str | None:
|
||||||
"""Generate a ZIP pack for a platform.
|
"""Generate a ZIP pack for a platform.
|
||||||
|
|
||||||
@@ -1145,7 +1152,7 @@ def generate_pack(
|
|||||||
f"{base_dest}/{instr_name}" if base_dest else instr_name
|
f"{base_dest}/{instr_name}" if base_dest else instr_name
|
||||||
)
|
)
|
||||||
zf.writestr(
|
zf.writestr(
|
||||||
instr_path,
|
_flat(instr_path, base_dest, flatten),
|
||||||
f"File needed: {file_entry['name']}\n\n{instructions}\n",
|
f"File needed: {file_entry['name']}\n\n{instructions}\n",
|
||||||
)
|
)
|
||||||
user_provided.append(file_entry["name"])
|
user_provided.append(file_entry["name"])
|
||||||
@@ -1171,9 +1178,9 @@ def generate_pack(
|
|||||||
if download_external(file_entry, tmp_path):
|
if download_external(file_entry, tmp_path):
|
||||||
extract = file_entry.get("extract", False)
|
extract = file_entry.get("extract", False)
|
||||||
if extract and tmp_path.endswith(".zip"):
|
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:
|
else:
|
||||||
zf.write(tmp_path, full_dest)
|
zf.write(tmp_path, _flat(full_dest, base_dest, flatten))
|
||||||
seen_destinations.add(dedup_key)
|
seen_destinations.add(dedup_key)
|
||||||
_register_path(dedup_key, seen_destinations, seen_parents)
|
_register_path(dedup_key, seen_destinations, seen_parents)
|
||||||
if case_insensitive:
|
if case_insensitive:
|
||||||
@@ -1251,7 +1258,7 @@ def generate_pack(
|
|||||||
else readme_name
|
else readme_name
|
||||||
)
|
)
|
||||||
if readme_full not in seen_destinations:
|
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)
|
seen_destinations.add(readme_full)
|
||||||
status = "agnostic_fallback"
|
status = "agnostic_fallback"
|
||||||
# Fall through to normal packing below
|
# Fall through to normal packing below
|
||||||
@@ -1308,10 +1315,11 @@ def generate_pack(
|
|||||||
and validation_index
|
and validation_index
|
||||||
):
|
):
|
||||||
fname = file_entry.get("name", "")
|
fname = file_entry.get("name", "")
|
||||||
reason = check_file_validation(
|
check = check_file_validation(
|
||||||
local_path, fname, validation_index, bios_dir
|
local_path, fname, validation_index, bios_dir
|
||||||
)
|
)
|
||||||
if reason:
|
if check:
|
||||||
|
reason, emus_list = check
|
||||||
better = _find_candidate_satisfying_both(
|
better = _find_candidate_satisfying_both(
|
||||||
file_entry,
|
file_entry,
|
||||||
db,
|
db,
|
||||||
@@ -1322,8 +1330,7 @@ def generate_pack(
|
|||||||
if better:
|
if better:
|
||||||
local_path = better
|
local_path = better
|
||||||
else:
|
else:
|
||||||
ventry = validation_index.get(fname, {})
|
emus = ", ".join(emus_list)
|
||||||
emus = ", ".join(ventry.get("emulators", []))
|
|
||||||
file_reasons.setdefault(
|
file_reasons.setdefault(
|
||||||
dedup_key,
|
dedup_key,
|
||||||
f"{platform_display} says OK but {emus} says {reason}",
|
f"{platform_display} says OK but {emus} says {reason}",
|
||||||
@@ -1337,12 +1344,13 @@ def generate_pack(
|
|||||||
seen_lower.add(dedup_key.lower())
|
seen_lower.add(dedup_key.lower())
|
||||||
|
|
||||||
extract = file_entry.get("extract", False)
|
extract = file_entry.get("extract", False)
|
||||||
|
flat_dest = _flat(full_dest, base_dest, flatten)
|
||||||
if extract and local_path.endswith(".zip"):
|
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"):
|
elif local_path.endswith(".zip"):
|
||||||
_normalize_zip_for_pack(local_path, full_dest, zf)
|
_normalize_zip_for_pack(local_path, flat_dest, zf)
|
||||||
else:
|
else:
|
||||||
zf.write(local_path, full_dest)
|
zf.write(local_path, flat_dest)
|
||||||
total_files += 1
|
total_files += 1
|
||||||
|
|
||||||
# Core requirements: files platform's cores need but YAML doesn't declare
|
# Core requirements: files platform's cores need but YAML doesn't declare
|
||||||
@@ -1428,10 +1436,11 @@ def generate_pack(
|
|||||||
if status in ("not_found", "external", "user_provided"):
|
if status in ("not_found", "external", "user_provided"):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
flat_dest = _flat(full_dest, base_dest, flatten)
|
||||||
if local_path.endswith(".zip"):
|
if local_path.endswith(".zip"):
|
||||||
_normalize_zip_for_pack(local_path, full_dest, zf)
|
_normalize_zip_for_pack(local_path, flat_dest, zf)
|
||||||
else:
|
else:
|
||||||
zf.write(local_path, full_dest)
|
zf.write(local_path, flat_dest)
|
||||||
seen_destinations.add(full_dest)
|
seen_destinations.add(full_dest)
|
||||||
_register_path(full_dest, seen_destinations, seen_parents)
|
_register_path(full_dest, seen_destinations, seen_parents)
|
||||||
if case_insensitive:
|
if case_insensitive:
|
||||||
@@ -1477,14 +1486,20 @@ def generate_pack(
|
|||||||
_register_path(full, seen_destinations, seen_parents)
|
_register_path(full, seen_destinations, seen_parents)
|
||||||
if case_insensitive:
|
if case_insensitive:
|
||||||
seen_lower.add(full.lower())
|
seen_lower.add(full.lower())
|
||||||
zf.write(src, full)
|
zf.write(src, _flat(full, base_dest, flatten))
|
||||||
total_files += 1
|
total_files += 1
|
||||||
|
|
||||||
# README.txt for users -personalized step-by-step per platform
|
# README.txt for users -personalized step-by-step per platform
|
||||||
num_systems = len(pack_systems)
|
num_systems = len(pack_systems)
|
||||||
|
_registry_path = Path(platforms_dir) / "_registry.yml"
|
||||||
|
_pack_registry: dict = {}
|
||||||
|
if _registry_path.exists():
|
||||||
|
with open(_registry_path) as _rf:
|
||||||
|
_pack_registry = (yaml.safe_load(_rf) or {}).get("platforms", {})
|
||||||
readme_text = _build_readme(
|
readme_text = _build_readme(
|
||||||
platform_name, platform_display, base_dest, total_files, num_systems,
|
platform_name, platform_display, base_dest, total_files, num_systems,
|
||||||
source=source,
|
source=source,
|
||||||
|
contributors=_pack_registry.get(platform_name, {}).get("contributed_by", []),
|
||||||
)
|
)
|
||||||
zf.writestr("README.txt", readme_text)
|
zf.writestr("README.txt", readme_text)
|
||||||
|
|
||||||
@@ -2414,6 +2429,11 @@ def _run_verify_packs(args):
|
|||||||
with zipfile.ZipFile(zip_path) as zf:
|
with zipfile.ZipFile(zip_path) as zf:
|
||||||
zf.extractall(extract_dir)
|
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 = []
|
missing = []
|
||||||
hash_fail = []
|
hash_fail = []
|
||||||
ok = 0
|
ok = 0
|
||||||
@@ -2424,7 +2444,7 @@ def _run_verify_packs(args):
|
|||||||
continue
|
continue
|
||||||
fp = (
|
fp = (
|
||||||
os.path.join(extract_dir, base_dest, dest)
|
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)
|
else os.path.join(extract_dir, dest)
|
||||||
)
|
)
|
||||||
# Case-insensitive fallback
|
# Case-insensitive fallback
|
||||||
@@ -2595,9 +2615,11 @@ def _run_platform_packs(
|
|||||||
load_platform_config(p, args.platforms_dir).get("platform", p)
|
load_platform_config(p, args.platforms_dir).get("platform", p)
|
||||||
for p in group_platforms
|
for p in group_platforms
|
||||||
]
|
]
|
||||||
|
source_tag = {"platform": "_Platform", "truth": "_Truth"}.get(source, "")
|
||||||
|
req_tag = "_Required" if required_only else ""
|
||||||
combined = (
|
combined = (
|
||||||
"_".join(n.replace(" ", "") for n in all_names)
|
"_".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)
|
new_path = os.path.join(os.path.dirname(zip_path), combined)
|
||||||
if new_path != zip_path:
|
if new_path != zip_path:
|
||||||
@@ -3257,7 +3279,11 @@ def verify_pack(
|
|||||||
# Data directory: check against cached files
|
# Data directory: check against cached files
|
||||||
if status == "untracked" and _data_index:
|
if status == "untracked" and _data_index:
|
||||||
_bn = os.path.basename(name)
|
_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 = []
|
_cands = []
|
||||||
if _pr in _data_path_index:
|
if _pr in _data_path_index:
|
||||||
_cands.append(_data_path_index[_pr])
|
_cands.append(_data_path_index[_pr])
|
||||||
@@ -3424,6 +3450,13 @@ def verify_pack_against_platform(
|
|||||||
zip_set = set(zf.namelist())
|
zip_set = set(zf.namelist())
|
||||||
zip_lower = {n.lower(): n for n in zip_set}
|
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
|
# Structural checks
|
||||||
dupes = sum(1 for c in Counter(zf.namelist()).values() if c > 1)
|
dupes = sum(1 for c in Counter(zf.namelist()).values() if c > 1)
|
||||||
if dupes:
|
if dupes:
|
||||||
@@ -3453,7 +3486,7 @@ def verify_pack_against_platform(
|
|||||||
dest = fe.get("destination", fe.get("name", ""))
|
dest = fe.get("destination", fe.get("name", ""))
|
||||||
if not dest:
|
if not dest:
|
||||||
continue
|
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
|
baseline_checked += 1
|
||||||
|
|
||||||
if expected in zip_set or expected.lower() in zip_lower:
|
if expected in zip_set or expected.lower() in zip_lower:
|
||||||
@@ -3480,7 +3513,7 @@ def verify_pack_against_platform(
|
|||||||
continue
|
continue
|
||||||
raw_dest = u.get("path") or u["name"]
|
raw_dest = u.get("path") or u["name"]
|
||||||
dest = f"{raw_dest}{u['name']}" if raw_dest.endswith("/") else raw_dest
|
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}/"):
|
if not dest.startswith(f"{extras_pfx}/"):
|
||||||
full = f"{extras_pfx}/{dest}"
|
full = f"{extras_pfx}/{dest}"
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -143,7 +143,9 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
lines = [
|
lines = [
|
||||||
"# RetroBIOS",
|
'<p align="center">',
|
||||||
|
' <img src=".github/assets/banner.png" alt="RetroBIOS" width="400">',
|
||||||
|
"</p>",
|
||||||
"",
|
"",
|
||||||
f"Complete BIOS and firmware packs for "
|
f"Complete BIOS and firmware packs for "
|
||||||
f"{', '.join(c['platform'] for c in sorted(coverages.values(), key=lambda x: x[
|
f"{', '.join(c['platform'] for c in sorted(coverages.values(), key=lambda x: x[
|
||||||
@@ -349,6 +351,13 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
|
|||||||
|
|
||||||
lines.extend(
|
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",
|
"## Contributing",
|
||||||
"",
|
"",
|
||||||
@@ -375,6 +384,16 @@ def generate_contributing() -> str:
|
|||||||
3. Variants (alternate hashes): `bios/Manufacturer/Console/.variants/`
|
3. Variants (alternate hashes): `bios/Manufacturer/Console/.variants/`
|
||||||
4. Create a Pull Request - checksums are verified automatically
|
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
|
## File conventions
|
||||||
|
|
||||||
- Files >50 MB go in GitHub release assets (`large-files` release)
|
- Files >50 MB go in GitHub release assets (`large-files` release)
|
||||||
|
|||||||
+954
-255
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,8 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""Scraper for RetroDECK BIOS requirements.
|
"""Scraper for RetroDECK BIOS requirements.
|
||||||
|
|
||||||
|
Platform contributed by @monster-penguin (#36).
|
||||||
|
|
||||||
Source: https://github.com/RetroDECK/components
|
Source: https://github.com/RetroDECK/components
|
||||||
Format: component_manifest.json per component directory
|
Format: component_manifest.json per component directory
|
||||||
Hash: MD5 (primary), SHA256 for some entries (melonDS DSi)
|
Hash: MD5 (primary), SHA256 for some entries (melonDS DSi)
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""Scraper for RomM BIOS requirements.
|
"""Scraper for RomM BIOS requirements.
|
||||||
|
|
||||||
|
Platform contributed by @PixNyb (#37).
|
||||||
|
|
||||||
Source: https://github.com/rommapp/romm
|
Source: https://github.com/rommapp/romm
|
||||||
Format: JSON fixture mapping "slug:filename" to {size, crc, md5, sha1}
|
Format: JSON fixture mapping "slug:filename" to {size, crc, md5, sha1}
|
||||||
Hash: SHA1 primary (all four hashes available per entry)
|
Hash: SHA1 primary (all four hashes available per entry)
|
||||||
|
|||||||
+142
-21
@@ -12,6 +12,16 @@ from common import _norm_system_id, resolve_platform_cores
|
|||||||
from validation import filter_files_by_mode
|
from validation import filter_files_by_mode
|
||||||
|
|
||||||
|
|
||||||
|
def _serialize_source_ref(sr: object) -> str:
|
||||||
|
"""Convert a source_ref value to a clean string for serialization."""
|
||||||
|
if isinstance(sr, str):
|
||||||
|
return sr
|
||||||
|
if isinstance(sr, dict):
|
||||||
|
parts = [f"{k}: {v}" for k, v in sr.items()]
|
||||||
|
return "; ".join(parts)
|
||||||
|
return str(sr)
|
||||||
|
|
||||||
|
|
||||||
def _determine_core_mode(
|
def _determine_core_mode(
|
||||||
emu_name: str,
|
emu_name: str,
|
||||||
profile: dict,
|
profile: dict,
|
||||||
@@ -35,31 +45,78 @@ def _determine_core_mode(
|
|||||||
|
|
||||||
|
|
||||||
def _enrich_hashes(entry: dict, db: dict) -> None:
|
def _enrich_hashes(entry: dict, db: dict) -> None:
|
||||||
"""Fill missing hash fields from the database."""
|
"""Fill missing sibling hashes from the database, ground-truth preserving.
|
||||||
sha1 = entry.get("sha1", "")
|
|
||||||
md5 = entry.get("md5", "")
|
|
||||||
|
|
||||||
# Hashes can be lists (multi-hash) — use first string value
|
The profile's hashes come from the emulator source code (ground truth).
|
||||||
if isinstance(sha1, list):
|
Any hash of a given file set of bytes is a projection of that same
|
||||||
sha1 = sha1[0] if sha1 else ""
|
ground truth — sha1, md5, crc32 all identify the same bytes. If the
|
||||||
if isinstance(md5, list):
|
profile has ONE ground-truth hash, the DB can supply its siblings.
|
||||||
md5 = md5[0] if md5 else ""
|
|
||||||
|
Lookup order (all are hash-anchored, never name-based):
|
||||||
|
1. SHA1 direct
|
||||||
|
2. MD5 -> SHA1 via indexes.by_md5
|
||||||
|
3. CRC32 -> SHA1 via indexes.by_crc32 (weaker 32-bit anchor,
|
||||||
|
requires size match when profile has size)
|
||||||
|
|
||||||
|
Name-based enrichment is NEVER used: a name alone has no ground-truth
|
||||||
|
anchor, the file in bios/ may not match what the source code expects.
|
||||||
|
|
||||||
|
Multi-hash entries (lists of accepted variants) are left untouched to
|
||||||
|
preserve variant information.
|
||||||
|
"""
|
||||||
|
# Skip multi-hash entries — they express ground truth as "any of these N
|
||||||
|
# variants", enriching with a single sibling would lose that information.
|
||||||
|
for h in ("sha1", "md5", "crc32"):
|
||||||
|
if isinstance(entry.get(h), list):
|
||||||
|
return
|
||||||
|
|
||||||
|
files_db = db.get("files", {})
|
||||||
|
indexes = db.get("indexes", {})
|
||||||
|
|
||||||
record = None
|
record = None
|
||||||
if sha1 and isinstance(sha1, str) and db.get("files"):
|
|
||||||
record = db["files"].get(sha1)
|
# Anchor 1: SHA1 (strongest)
|
||||||
if record is None and md5:
|
sha1 = entry.get("sha1")
|
||||||
by_md5 = db.get("by_md5", {})
|
if sha1 and isinstance(sha1, str):
|
||||||
md5_str = md5 if isinstance(md5, str) else md5[0] if md5 else ""
|
record = files_db.get(sha1)
|
||||||
ref_sha1 = by_md5.get(md5_str.lower()) if md5_str else None
|
|
||||||
if ref_sha1 and db.get("files"):
|
# Anchor 2: MD5 (strong)
|
||||||
record = db["files"].get(ref_sha1)
|
if record is None:
|
||||||
|
md5 = entry.get("md5")
|
||||||
|
if md5 and isinstance(md5, str):
|
||||||
|
by_md5 = indexes.get("by_md5", {})
|
||||||
|
ref = by_md5.get(md5.lower())
|
||||||
|
if ref:
|
||||||
|
ref_sha1 = ref if isinstance(ref, str) else (ref[0] if ref else None)
|
||||||
|
if ref_sha1:
|
||||||
|
record = files_db.get(ref_sha1)
|
||||||
|
|
||||||
|
# Anchor 3: CRC32 (32-bit, collisions theoretically possible).
|
||||||
|
# Require size match when profile has a size to guard against collisions.
|
||||||
|
if record is None:
|
||||||
|
crc = entry.get("crc32")
|
||||||
|
if crc and isinstance(crc, str):
|
||||||
|
by_crc32 = indexes.get("by_crc32", {})
|
||||||
|
ref = by_crc32.get(crc.lower())
|
||||||
|
if ref:
|
||||||
|
ref_sha1 = ref if isinstance(ref, str) else (ref[0] if ref else None)
|
||||||
|
if ref_sha1:
|
||||||
|
candidate = files_db.get(ref_sha1)
|
||||||
|
if candidate is not None:
|
||||||
|
profile_size = entry.get("size")
|
||||||
|
if not profile_size or candidate.get("size") == profile_size:
|
||||||
|
record = candidate
|
||||||
|
|
||||||
if record is None:
|
if record is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Copy sibling hashes and size from the anchored record.
|
||||||
|
# These are projections of the same ground-truth bytes.
|
||||||
for field in ("sha1", "md5", "sha256", "crc32"):
|
for field in ("sha1", "md5", "sha256", "crc32"):
|
||||||
if not entry.get(field) and record.get(field):
|
if not entry.get(field) and record.get(field):
|
||||||
entry[field] = record[field]
|
entry[field] = record[field]
|
||||||
|
if not entry.get("size") and record.get("size"):
|
||||||
|
entry["size"] = record["size"]
|
||||||
|
|
||||||
|
|
||||||
def _merge_file_into_system(
|
def _merge_file_into_system(
|
||||||
@@ -82,7 +139,7 @@ def _merge_file_into_system(
|
|||||||
existing["_cores"] = existing.get("_cores", set()) | {emu_name}
|
existing["_cores"] = existing.get("_cores", set()) | {emu_name}
|
||||||
sr = file_entry.get("source_ref")
|
sr = file_entry.get("source_ref")
|
||||||
if sr is not None:
|
if sr is not None:
|
||||||
sr_key = str(sr) if not isinstance(sr, str) else sr
|
sr_key = _serialize_source_ref(sr)
|
||||||
existing["_source_refs"] = existing.get("_source_refs", set()) | {sr_key}
|
existing["_source_refs"] = existing.get("_source_refs", set()) | {sr_key}
|
||||||
else:
|
else:
|
||||||
existing.setdefault("_source_refs", set())
|
existing.setdefault("_source_refs", set())
|
||||||
@@ -91,14 +148,41 @@ def _merge_file_into_system(
|
|||||||
for h in ("sha1", "md5", "sha256", "crc32"):
|
for h in ("sha1", "md5", "sha256", "crc32"):
|
||||||
theirs = file_entry.get(h, "")
|
theirs = file_entry.get(h, "")
|
||||||
ours = existing.get(h, "")
|
ours = existing.get(h, "")
|
||||||
if theirs and ours and theirs.lower() != ours.lower():
|
# Skip empty strings
|
||||||
|
if not theirs or theirs == "":
|
||||||
|
continue
|
||||||
|
if not ours or ours == "":
|
||||||
|
existing[h] = theirs
|
||||||
|
continue
|
||||||
|
# Normalize to sets for multi-hash comparison
|
||||||
|
t_list = theirs if isinstance(theirs, list) else [theirs]
|
||||||
|
o_list = ours if isinstance(ours, list) else [ours]
|
||||||
|
t_set = {str(v).lower() for v in t_list}
|
||||||
|
o_set = {str(v).lower() for v in o_list}
|
||||||
|
if not t_set & o_set:
|
||||||
print(
|
print(
|
||||||
f"WARNING: hash conflict for {file_entry['name']} "
|
f"WARNING: hash conflict for {file_entry['name']} "
|
||||||
f"({h}: {ours} vs {theirs}, core {emu_name})",
|
f"({h}: {ours} vs {theirs}, core {emu_name})",
|
||||||
file=sys.stderr,
|
file=sys.stderr,
|
||||||
)
|
)
|
||||||
elif theirs and not ours:
|
# Merge non-hash data fields if existing lacks them.
|
||||||
existing[h] = theirs
|
# A core that creates an entry without size/path/validation may be
|
||||||
|
# enriched by a sibling core that has those fields.
|
||||||
|
for field in (
|
||||||
|
"size",
|
||||||
|
"min_size",
|
||||||
|
"max_size",
|
||||||
|
"path",
|
||||||
|
"validation",
|
||||||
|
"description",
|
||||||
|
"category",
|
||||||
|
"hle_fallback",
|
||||||
|
"note",
|
||||||
|
"aliases",
|
||||||
|
"contents",
|
||||||
|
):
|
||||||
|
if file_entry.get(field) is not None and existing.get(field) is None:
|
||||||
|
existing[field] = file_entry[field]
|
||||||
return
|
return
|
||||||
|
|
||||||
entry: dict = {"name": file_entry["name"]}
|
entry: dict = {"name": file_entry["name"]}
|
||||||
@@ -119,14 +203,25 @@ def _merge_file_into_system(
|
|||||||
"min_size",
|
"min_size",
|
||||||
"max_size",
|
"max_size",
|
||||||
"aliases",
|
"aliases",
|
||||||
|
"contents",
|
||||||
):
|
):
|
||||||
val = file_entry.get(field)
|
val = file_entry.get(field)
|
||||||
if val is not None:
|
if val is not None:
|
||||||
entry[field] = val
|
entry[field] = val
|
||||||
|
# Strip empty string hashes (profile says "" when hash is unknown)
|
||||||
|
for h in ("sha1", "md5", "sha256", "crc32"):
|
||||||
|
if entry.get(h) == "":
|
||||||
|
del entry[h]
|
||||||
|
# Normalize CRC32: strip 0x prefix, lowercase
|
||||||
|
crc = entry.get("crc32")
|
||||||
|
if isinstance(crc, str) and crc.startswith("0x"):
|
||||||
|
entry["crc32"] = crc[2:].lower()
|
||||||
|
elif isinstance(crc, str) and crc != crc.lower():
|
||||||
|
entry["crc32"] = crc.lower()
|
||||||
entry["_cores"] = {emu_name}
|
entry["_cores"] = {emu_name}
|
||||||
sr = file_entry.get("source_ref")
|
sr = file_entry.get("source_ref")
|
||||||
if sr is not None:
|
if sr is not None:
|
||||||
sr_key = str(sr) if not isinstance(sr, str) else sr
|
sr_key = _serialize_source_ref(sr)
|
||||||
entry["_source_refs"] = {sr_key}
|
entry["_source_refs"] = {sr_key}
|
||||||
else:
|
else:
|
||||||
entry["_source_refs"] = set()
|
entry["_source_refs"] = set()
|
||||||
@@ -137,6 +232,23 @@ def _merge_file_into_system(
|
|||||||
files.append(entry)
|
files.append(entry)
|
||||||
|
|
||||||
|
|
||||||
|
def _has_exploitable_data(entry: dict) -> bool:
|
||||||
|
"""Check if an entry has any data beyond its name that can drive verification.
|
||||||
|
|
||||||
|
Applied AFTER merging all cores so entries benefit from enrichment by
|
||||||
|
sibling cores before being judged empty.
|
||||||
|
"""
|
||||||
|
return bool(
|
||||||
|
any(entry.get(h) for h in ("sha1", "md5", "sha256", "crc32"))
|
||||||
|
or entry.get("path")
|
||||||
|
or entry.get("size")
|
||||||
|
or entry.get("min_size")
|
||||||
|
or entry.get("max_size")
|
||||||
|
or entry.get("validation")
|
||||||
|
or entry.get("contents")
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def generate_platform_truth(
|
def generate_platform_truth(
|
||||||
platform_name: str,
|
platform_name: str,
|
||||||
config: dict,
|
config: dict,
|
||||||
@@ -274,6 +386,15 @@ def generate_platform_truth(
|
|||||||
)
|
)
|
||||||
sys_cov["unprofiled"].add(emu_name)
|
sys_cov["unprofiled"].add(emu_name)
|
||||||
|
|
||||||
|
# Drop files with no exploitable data AFTER all cores have contributed.
|
||||||
|
# A file declared by one core without hash/size/path may be enriched by
|
||||||
|
# another core that has the same entry with data — the filter must run
|
||||||
|
# once at the end, not per-core at creation time.
|
||||||
|
for sys_data in systems.values():
|
||||||
|
files_list = sys_data.get("files", [])
|
||||||
|
if files_list:
|
||||||
|
sys_data["files"] = [fe for fe in files_list if _has_exploitable_data(fe)]
|
||||||
|
|
||||||
# Convert sets to sorted lists for serialization
|
# Convert sets to sorted lists for serialization
|
||||||
for sys_id, sys_data in systems.items():
|
for sys_id, sys_data in systems.items():
|
||||||
for fe in sys_data.get("files", []):
|
for fe in sys_data.get("files", []):
|
||||||
|
|||||||
+71
-11
@@ -15,6 +15,25 @@ from common import compute_hashes
|
|||||||
# verify.py cannot reproduce these -size checks still apply if combined.
|
# verify.py cannot reproduce these -size checks still apply if combined.
|
||||||
_CRYPTO_CHECKS = frozenset({"signature", "crypto"})
|
_CRYPTO_CHECKS = frozenset({"signature", "crypto"})
|
||||||
|
|
||||||
|
|
||||||
|
def _adler32_byteswapped(path: str) -> str:
|
||||||
|
"""Compute adler32 on 16-bit byte-swapped data.
|
||||||
|
|
||||||
|
Dolphin's DSP loader swaps every 16-bit word before hashing
|
||||||
|
(Common::swap16 in DSPLLE.cpp:LoadDSPRom). This reproduces that
|
||||||
|
transform so verify.py can match the expected adler32 values.
|
||||||
|
"""
|
||||||
|
import struct
|
||||||
|
import zlib
|
||||||
|
|
||||||
|
with open(path, "rb") as f:
|
||||||
|
data = f.read()
|
||||||
|
# Pad to even length if necessary
|
||||||
|
if len(data) % 2:
|
||||||
|
data += b"\x00"
|
||||||
|
swapped = struct.pack(f">{len(data) // 2}H", *struct.unpack(f"<{len(data) // 2}H", data))
|
||||||
|
return format(zlib.adler32(swapped) & 0xFFFFFFFF, "08x")
|
||||||
|
|
||||||
# All reproducible validation types.
|
# All reproducible validation types.
|
||||||
_HASH_CHECKS = frozenset({"crc32", "md5", "sha1", "adler32"})
|
_HASH_CHECKS = frozenset({"crc32", "md5", "sha1", "adler32"})
|
||||||
|
|
||||||
@@ -72,6 +91,7 @@ def _build_validation_index(profiles: dict) -> dict[str, dict]:
|
|||||||
"sha1": set(),
|
"sha1": set(),
|
||||||
"sha256": set(),
|
"sha256": set(),
|
||||||
"adler32": set(),
|
"adler32": set(),
|
||||||
|
"adler32_byteswap": False,
|
||||||
"crypto_only": set(),
|
"crypto_only": set(),
|
||||||
"emulators": set(),
|
"emulators": set(),
|
||||||
"per_emulator": {},
|
"per_emulator": {},
|
||||||
@@ -82,8 +102,12 @@ def _build_validation_index(profiles: dict) -> dict[str, dict]:
|
|||||||
index[fname]["crypto_only"].update(c for c in checks if c in _CRYPTO_CHECKS)
|
index[fname]["crypto_only"].update(c for c in checks if c in _CRYPTO_CHECKS)
|
||||||
# Size checks
|
# Size checks
|
||||||
if "size" in checks:
|
if "size" in checks:
|
||||||
if f.get("size") is not None:
|
raw_size = f.get("size")
|
||||||
index[fname]["sizes"].add(f["size"])
|
if raw_size is not None:
|
||||||
|
if isinstance(raw_size, list):
|
||||||
|
index[fname]["sizes"].update(raw_size)
|
||||||
|
else:
|
||||||
|
index[fname]["sizes"].add(raw_size)
|
||||||
if f.get("min_size") is not None:
|
if f.get("min_size") is not None:
|
||||||
cur = index[fname]["min_size"]
|
cur = index[fname]["min_size"]
|
||||||
index[fname]["min_size"] = (
|
index[fname]["min_size"] = (
|
||||||
@@ -120,6 +144,8 @@ def _build_validation_index(profiles: dict) -> dict[str, dict]:
|
|||||||
if norm.startswith("0x"):
|
if norm.startswith("0x"):
|
||||||
norm = norm[2:]
|
norm = norm[2:]
|
||||||
index[fname]["adler32"].add(norm)
|
index[fname]["adler32"].add(norm)
|
||||||
|
if f.get("adler32_byteswap"):
|
||||||
|
index[fname]["adler32_byteswap"] = True
|
||||||
# Per-emulator ground truth detail
|
# Per-emulator ground truth detail
|
||||||
expected: dict = {}
|
expected: dict = {}
|
||||||
if "size" in checks:
|
if "size" in checks:
|
||||||
@@ -182,35 +208,56 @@ def build_ground_truth(filename: str, validation_index: dict[str, dict]) -> list
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def _emulators_for_check(
|
||||||
|
check_type: str, per_emulator: dict[str, dict],
|
||||||
|
) -> list[str]:
|
||||||
|
"""Return emulator names that validate a specific check type."""
|
||||||
|
result = []
|
||||||
|
for emu, detail in per_emulator.items():
|
||||||
|
emu_checks = detail.get("checks", [])
|
||||||
|
if check_type in emu_checks:
|
||||||
|
result.append(emu)
|
||||||
|
# adler32 is stored as known_hash, not always in validation list
|
||||||
|
if check_type == "adler32" and detail.get("expected", {}).get("adler32"):
|
||||||
|
if emu not in result:
|
||||||
|
result.append(emu)
|
||||||
|
return sorted(result)
|
||||||
|
|
||||||
|
|
||||||
def check_file_validation(
|
def check_file_validation(
|
||||||
local_path: str,
|
local_path: str,
|
||||||
filename: str,
|
filename: str,
|
||||||
validation_index: dict[str, dict],
|
validation_index: dict[str, dict],
|
||||||
bios_dir: str = "bios",
|
bios_dir: str = "bios",
|
||||||
) -> str | None:
|
) -> tuple[str, list[str]] | None:
|
||||||
"""Check emulator-level validation on a resolved file.
|
"""Check emulator-level validation on a resolved file.
|
||||||
|
|
||||||
Supports: size (exact/min/max), crc32, md5, sha1, adler32,
|
Supports: size (exact/min/max), crc32, md5, sha1, adler32,
|
||||||
signature (RSA-2048 PKCS1v15 SHA256), crypto (AES-128-CBC + SHA256).
|
signature (RSA-2048 PKCS1v15 SHA256), crypto (AES-128-CBC + SHA256).
|
||||||
|
|
||||||
Returns None if all checks pass or no validation applies.
|
Returns None if all checks pass or no validation applies.
|
||||||
Returns a reason string if a check fails.
|
Returns (reason, emulators) tuple on failure, where *emulators*
|
||||||
|
lists only those cores whose check actually failed.
|
||||||
"""
|
"""
|
||||||
entry = validation_index.get(filename)
|
entry = validation_index.get(filename)
|
||||||
if not entry:
|
if not entry:
|
||||||
return None
|
return None
|
||||||
checks = entry["checks"]
|
checks = entry["checks"]
|
||||||
|
pe = entry.get("per_emulator", {})
|
||||||
|
|
||||||
# Size checks -sizes is a set of accepted values
|
# Size checks -sizes is a set of accepted values
|
||||||
if "size" in checks:
|
if "size" in checks:
|
||||||
actual_size = os.path.getsize(local_path)
|
actual_size = os.path.getsize(local_path)
|
||||||
if entry["sizes"] and actual_size not in entry["sizes"]:
|
if entry["sizes"] and actual_size not in entry["sizes"]:
|
||||||
expected = ",".join(str(s) for s in sorted(entry["sizes"]))
|
expected = ",".join(str(s) for s in sorted(entry["sizes"]))
|
||||||
return f"size mismatch: got {actual_size}, accepted [{expected}]"
|
emus = _emulators_for_check("size", pe)
|
||||||
|
return f"size mismatch: got {actual_size}, accepted [{expected}]", emus
|
||||||
if entry["min_size"] is not None and actual_size < entry["min_size"]:
|
if entry["min_size"] is not None and actual_size < entry["min_size"]:
|
||||||
return f"size too small: min {entry['min_size']}, got {actual_size}"
|
emus = _emulators_for_check("size", pe)
|
||||||
|
return f"size too small: min {entry['min_size']}, got {actual_size}", emus
|
||||||
if entry["max_size"] is not None and actual_size > entry["max_size"]:
|
if entry["max_size"] is not None and actual_size > entry["max_size"]:
|
||||||
return f"size too large: max {entry['max_size']}, got {actual_size}"
|
emus = _emulators_for_check("size", pe)
|
||||||
|
return f"size too large: max {entry['max_size']}, got {actual_size}", emus
|
||||||
|
|
||||||
# Hash checks -compute once, reuse for all hash types.
|
# Hash checks -compute once, reuse for all hash types.
|
||||||
# Each hash field is a set of accepted values (multiple valid ROM versions).
|
# Each hash field is a set of accepted values (multiple valid ROM versions).
|
||||||
@@ -223,11 +270,23 @@ def check_file_validation(
|
|||||||
if hash_type in checks and entry[hash_type]:
|
if hash_type in checks and entry[hash_type]:
|
||||||
if hashes[hash_type].lower() not in entry[hash_type]:
|
if hashes[hash_type].lower() not in entry[hash_type]:
|
||||||
expected = ",".join(sorted(entry[hash_type]))
|
expected = ",".join(sorted(entry[hash_type]))
|
||||||
return f"{hash_type} mismatch: got {hashes[hash_type]}, accepted [{expected}]"
|
emus = _emulators_for_check(hash_type, pe)
|
||||||
|
return (
|
||||||
|
f"{hash_type} mismatch: got {hashes[hash_type]}, "
|
||||||
|
f"accepted [{expected}]",
|
||||||
|
emus,
|
||||||
|
)
|
||||||
if entry["adler32"]:
|
if entry["adler32"]:
|
||||||
if hashes["adler32"].lower() not in entry["adler32"]:
|
actual_adler = hashes["adler32"].lower()
|
||||||
|
if entry.get("adler32_byteswap"):
|
||||||
|
actual_adler = _adler32_byteswapped(local_path)
|
||||||
|
if actual_adler not in entry["adler32"]:
|
||||||
expected = ",".join(sorted(entry["adler32"]))
|
expected = ",".join(sorted(entry["adler32"]))
|
||||||
return f"adler32 mismatch: got 0x{hashes['adler32']}, accepted [{expected}]"
|
emus = _emulators_for_check("adler32", pe)
|
||||||
|
return (
|
||||||
|
f"adler32 mismatch: got 0x{actual_adler}, accepted [{expected}]",
|
||||||
|
emus,
|
||||||
|
)
|
||||||
|
|
||||||
# Signature/crypto checks (3DS RSA, AES)
|
# Signature/crypto checks (3DS RSA, AES)
|
||||||
if entry["crypto_only"]:
|
if entry["crypto_only"]:
|
||||||
@@ -235,7 +294,8 @@ def check_file_validation(
|
|||||||
|
|
||||||
crypto_reason = check_crypto_validation(local_path, filename, bios_dir)
|
crypto_reason = check_crypto_validation(local_path, filename, bios_dir)
|
||||||
if crypto_reason:
|
if crypto_reason:
|
||||||
return crypto_reason
|
emus = sorted(entry.get("emulators", []))
|
||||||
|
return crypto_reason, emus
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|||||||
+134
-36
@@ -94,6 +94,7 @@ def verify_entry_existence(
|
|||||||
file_entry: dict,
|
file_entry: dict,
|
||||||
local_path: str | None,
|
local_path: str | None,
|
||||||
validation_index: dict[str, dict] | None = None,
|
validation_index: dict[str, dict] | None = None,
|
||||||
|
db: dict | None = None,
|
||||||
) -> dict:
|
) -> dict:
|
||||||
"""RetroArch verification: path_is_valid() -file exists = OK."""
|
"""RetroArch verification: path_is_valid() -file exists = OK."""
|
||||||
name = file_entry.get("name", "")
|
name = file_entry.get("name", "")
|
||||||
@@ -102,11 +103,21 @@ def verify_entry_existence(
|
|||||||
return {"name": name, "status": Status.MISSING, "required": required}
|
return {"name": name, "status": Status.MISSING, "required": required}
|
||||||
result = {"name": name, "status": Status.OK, "required": required}
|
result = {"name": name, "status": Status.OK, "required": required}
|
||||||
if validation_index:
|
if validation_index:
|
||||||
reason = check_file_validation(local_path, name, validation_index)
|
check = check_file_validation(local_path, name, validation_index)
|
||||||
if reason:
|
if check:
|
||||||
ventry = validation_index.get(name, {})
|
reason, emus_list = check
|
||||||
emus = ", ".join(ventry.get("emulators", []))
|
suppressed = False
|
||||||
result["discrepancy"] = f"file present (OK) but {emus} says {reason}"
|
if db:
|
||||||
|
better = _find_best_variant(
|
||||||
|
file_entry, db, local_path, validation_index,
|
||||||
|
)
|
||||||
|
if better:
|
||||||
|
suppressed = True
|
||||||
|
if not suppressed:
|
||||||
|
emus = ", ".join(emus_list)
|
||||||
|
result["discrepancy"] = (
|
||||||
|
f"file present (OK) but {emus} says {reason}"
|
||||||
|
)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
@@ -287,13 +298,23 @@ def _name_in_index(
|
|||||||
by_name: dict,
|
by_name: dict,
|
||||||
by_path_suffix: dict | None = None,
|
by_path_suffix: dict | None = None,
|
||||||
data_names: set[str] | None = None,
|
data_names: set[str] | None = None,
|
||||||
|
by_name_lower: dict[str, str] | None = None,
|
||||||
) -> bool:
|
) -> bool:
|
||||||
"""Check if a name is resolvable in the database indexes or data directories."""
|
"""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:
|
if name in by_name:
|
||||||
return True
|
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:
|
if basename != name and basename in by_name:
|
||||||
return True
|
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:
|
if by_path_suffix and name in by_path_suffix:
|
||||||
return True
|
return True
|
||||||
if data_names:
|
if data_names:
|
||||||
@@ -334,6 +355,7 @@ def find_undeclared_files(
|
|||||||
declared_dd.add(ref)
|
declared_dd.add(ref)
|
||||||
|
|
||||||
by_name = db.get("indexes", {}).get("by_name", {})
|
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", {})
|
by_path_suffix = db.get("indexes", {}).get("by_path_suffix", {})
|
||||||
profiles = (
|
profiles = (
|
||||||
emu_profiles
|
emu_profiles
|
||||||
@@ -367,6 +389,10 @@ def find_undeclared_files(
|
|||||||
fname = f.get("name", "")
|
fname = f.get("name", "")
|
||||||
if not fname or fname in seen_files:
|
if not fname or fname in seen_files:
|
||||||
continue
|
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)
|
# Skip pattern placeholders (e.g., <user-selected>.bin)
|
||||||
if "<" in fname or ">" in fname or "*" in fname:
|
if "<" in fname or ">" in fname or "*" in fname:
|
||||||
continue
|
continue
|
||||||
@@ -405,7 +431,8 @@ def find_undeclared_files(
|
|||||||
if archive:
|
if archive:
|
||||||
if archive not in archive_entries:
|
if archive not in archive_entries:
|
||||||
in_repo = _name_in_index(
|
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] = {
|
archive_entries[archive] = {
|
||||||
"emulator": profile.get("emulator", emu_name),
|
"emulator": profile.get("emulator", emu_name),
|
||||||
@@ -436,11 +463,20 @@ def find_undeclared_files(
|
|||||||
else:
|
else:
|
||||||
dest = f.get("path") or fname
|
dest = f.get("path") or fname
|
||||||
|
|
||||||
# Resolution: try name, then path basename, then path_suffix
|
# Resolution: storage flag, then name, then path basename
|
||||||
in_repo = _name_in_index(fname, by_name, by_path_suffix, data_names)
|
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:
|
if not in_repo and dest != fname:
|
||||||
path_base = dest.rsplit("/", 1)[-1]
|
path_base = dest.rsplit("/", 1)[-1]
|
||||||
in_repo = _name_in_index(path_base, by_name, by_path_suffix, data_names)
|
in_repo = _name_in_index(
|
||||||
|
path_base, by_name, by_path_suffix, data_names,
|
||||||
|
by_name_lower,
|
||||||
|
)
|
||||||
|
|
||||||
checks = _parse_validation(f.get("validation"))
|
checks = _parse_validation(f.get("validation"))
|
||||||
undeclared.append(
|
undeclared.append(
|
||||||
@@ -561,37 +597,84 @@ def _find_best_variant(
|
|||||||
current_path: str,
|
current_path: str,
|
||||||
validation_index: dict,
|
validation_index: dict,
|
||||||
) -> str | None:
|
) -> str | None:
|
||||||
"""Search for a repo file that passes both platform MD5 and emulator validation."""
|
"""Search for a repo file that passes emulator validation.
|
||||||
|
|
||||||
|
Two-pass search:
|
||||||
|
1. Hash lookup — use the emulator's expected hashes (sha1, md5, sha256,
|
||||||
|
crc32) to find candidates directly in the DB indexes. This finds
|
||||||
|
variants stored under different filenames (e.g. megacd2_v200_eu.bin
|
||||||
|
for bios_CD_E.bin).
|
||||||
|
2. Name lookup — check all files sharing the same name (aliases,
|
||||||
|
.variants/ with name-based suffixes).
|
||||||
|
|
||||||
|
If any candidate on disk passes ``check_file_validation``, the
|
||||||
|
discrepancy is suppressed — the repo has what the emulator needs.
|
||||||
|
"""
|
||||||
fname = file_entry.get("name", "")
|
fname = file_entry.get("name", "")
|
||||||
if not fname or fname not in validation_index:
|
if not fname or fname not in validation_index:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
md5_expected = file_entry.get("md5", "")
|
|
||||||
md5_set = (
|
|
||||||
{m.strip().lower() for m in md5_expected.split(",") if m.strip()}
|
|
||||||
if md5_expected
|
|
||||||
else set()
|
|
||||||
)
|
|
||||||
|
|
||||||
by_name = db.get("indexes", {}).get("by_name", {})
|
|
||||||
files_db = db.get("files", {})
|
files_db = db.get("files", {})
|
||||||
|
current_real = os.path.realpath(current_path)
|
||||||
|
seen_paths: set[str] = set()
|
||||||
|
|
||||||
for sha1 in by_name.get(fname, []):
|
def _try_candidate(sha1: str) -> str | None:
|
||||||
candidate = files_db.get(sha1, {})
|
candidate = files_db.get(sha1, {})
|
||||||
path = candidate.get("path", "")
|
path = candidate.get("path", "")
|
||||||
if (
|
if not path or not os.path.exists(path):
|
||||||
not path
|
return None
|
||||||
or not os.path.exists(path)
|
rp = os.path.realpath(path)
|
||||||
or os.path.realpath(path) == os.path.realpath(current_path)
|
if rp == current_real or rp in seen_paths:
|
||||||
):
|
return None
|
||||||
continue
|
seen_paths.add(rp)
|
||||||
if md5_set and candidate.get("md5", "").lower() not in md5_set:
|
if check_file_validation(path, fname, validation_index) is None:
|
||||||
continue
|
|
||||||
reason = check_file_validation(path, fname, validation_index)
|
|
||||||
if reason is None:
|
|
||||||
return path
|
return path
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
# Pass 1: hash-based lookup from emulator expected values
|
||||||
|
ventry = validation_index[fname]
|
||||||
|
indexes = db.get("indexes", {})
|
||||||
|
for hash_type, db_index_key in (
|
||||||
|
("sha1", None),
|
||||||
|
("md5", "by_md5"),
|
||||||
|
("crc32", "by_crc32"),
|
||||||
|
("sha256", "by_sha256"),
|
||||||
|
):
|
||||||
|
expected = ventry.get(hash_type)
|
||||||
|
if not expected:
|
||||||
|
continue
|
||||||
|
if db_index_key is None:
|
||||||
|
# SHA1 is the primary key of files_db
|
||||||
|
for h in expected:
|
||||||
|
if h in files_db:
|
||||||
|
result = _try_candidate(h)
|
||||||
|
if result:
|
||||||
|
return result
|
||||||
|
continue
|
||||||
|
db_index = indexes.get(db_index_key, {})
|
||||||
|
for h in expected:
|
||||||
|
entries = db_index.get(h)
|
||||||
|
if not entries:
|
||||||
|
continue
|
||||||
|
if isinstance(entries, list):
|
||||||
|
for sha1 in entries:
|
||||||
|
result = _try_candidate(sha1)
|
||||||
|
if result:
|
||||||
|
return result
|
||||||
|
elif isinstance(entries, str):
|
||||||
|
result = _try_candidate(entries)
|
||||||
|
if result:
|
||||||
|
return result
|
||||||
|
|
||||||
|
# Pass 2: name-based lookup (aliases, .variants/ with same filename)
|
||||||
|
by_name = db.get("indexes", {}).get("by_name", {})
|
||||||
|
for sha1 in by_name.get(fname, []):
|
||||||
|
result = _try_candidate(sha1)
|
||||||
|
if result:
|
||||||
|
return result
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def verify_platform(
|
def verify_platform(
|
||||||
config: dict,
|
config: dict,
|
||||||
@@ -655,6 +738,7 @@ def verify_platform(
|
|||||||
file_entry,
|
file_entry,
|
||||||
local_path,
|
local_path,
|
||||||
validation_index,
|
validation_index,
|
||||||
|
db,
|
||||||
)
|
)
|
||||||
elif mode == "sha1":
|
elif mode == "sha1":
|
||||||
result = verify_entry_sha1(file_entry, local_path)
|
result = verify_entry_sha1(file_entry, local_path)
|
||||||
@@ -665,8 +749,11 @@ def verify_platform(
|
|||||||
# mismatches are reported as discrepancies, not failures.
|
# mismatches are reported as discrepancies, not failures.
|
||||||
if result["status"] == Status.OK and local_path and validation_index:
|
if result["status"] == Status.OK and local_path and validation_index:
|
||||||
fname = file_entry.get("name", "")
|
fname = file_entry.get("name", "")
|
||||||
reason = check_file_validation(local_path, fname, validation_index)
|
check = check_file_validation(
|
||||||
if reason:
|
local_path, fname, validation_index,
|
||||||
|
)
|
||||||
|
if check:
|
||||||
|
reason, emus_list = check
|
||||||
better = _find_best_variant(
|
better = _find_best_variant(
|
||||||
file_entry,
|
file_entry,
|
||||||
db,
|
db,
|
||||||
@@ -674,8 +761,7 @@ def verify_platform(
|
|||||||
validation_index,
|
validation_index,
|
||||||
)
|
)
|
||||||
if not better:
|
if not better:
|
||||||
ventry = validation_index.get(fname, {})
|
emus = ", ".join(emus_list)
|
||||||
emus = ", ".join(ventry.get("emulators", []))
|
|
||||||
result["discrepancy"] = (
|
result["discrepancy"] = (
|
||||||
f"{platform} says OK but {emus} says {reason}"
|
f"{platform} says OK but {emus} says {reason}"
|
||||||
)
|
)
|
||||||
@@ -1166,8 +1252,20 @@ def verify_emulator(
|
|||||||
result = {"name": name, "status": Status.MISSING, "required": required}
|
result = {"name": name, "status": Status.MISSING, "required": required}
|
||||||
else:
|
else:
|
||||||
# Apply emulator validation
|
# Apply emulator validation
|
||||||
reason = check_file_validation(local_path, name, validation_index)
|
check = check_file_validation(local_path, name, validation_index)
|
||||||
if reason:
|
if check:
|
||||||
|
reason, _emus = check
|
||||||
|
better = _find_best_variant(
|
||||||
|
file_entry, db, local_path, validation_index,
|
||||||
|
)
|
||||||
|
if better:
|
||||||
|
result = {
|
||||||
|
"name": name,
|
||||||
|
"status": Status.OK,
|
||||||
|
"required": required,
|
||||||
|
"path": better,
|
||||||
|
}
|
||||||
|
else:
|
||||||
result = {
|
result = {
|
||||||
"name": name,
|
"name": name,
|
||||||
"status": Status.UNTESTED,
|
"status": Status.UNTESTED,
|
||||||
|
|||||||
+32
-10
@@ -994,8 +994,10 @@ class TestE2E(unittest.TestCase):
|
|||||||
groups = group_identical_platforms(
|
groups = group_identical_platforms(
|
||||||
["test_existence", "test_inherited"], self.platforms_dir
|
["test_existence", "test_inherited"], self.platforms_dir
|
||||||
)
|
)
|
||||||
# Different base_destination ->separate groups
|
# With flat ZIPs, base_destination no longer separates groups
|
||||||
self.assertEqual(len(groups), 2)
|
# 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):
|
def test_51_platform_grouping_same(self):
|
||||||
# Create two identical platforms
|
# Create two identical platforms
|
||||||
@@ -1137,9 +1139,11 @@ class TestE2E(unittest.TestCase):
|
|||||||
profiles = load_emulator_profiles(self.emulators_dir)
|
profiles = load_emulator_profiles(self.emulators_dir)
|
||||||
index = _build_validation_index(profiles)
|
index = _build_validation_index(profiles)
|
||||||
path = self.files["present_opt.bin"]["path"]
|
path = self.files["present_opt.bin"]["path"]
|
||||||
reason = check_file_validation(path, "present_opt.bin", index)
|
result = check_file_validation(path, "present_opt.bin", index)
|
||||||
self.assertIsNotNone(reason)
|
self.assertIsNotNone(result)
|
||||||
|
reason, emus = result
|
||||||
self.assertIn("size mismatch", reason)
|
self.assertIn("size mismatch", reason)
|
||||||
|
self.assertIsInstance(emus, list)
|
||||||
|
|
||||||
def test_73_validation_crc32_pass(self):
|
def test_73_validation_crc32_pass(self):
|
||||||
"""File with correct CRC32 passes validation."""
|
"""File with correct CRC32 passes validation."""
|
||||||
@@ -1154,9 +1158,11 @@ class TestE2E(unittest.TestCase):
|
|||||||
profiles = load_emulator_profiles(self.emulators_dir)
|
profiles = load_emulator_profiles(self.emulators_dir)
|
||||||
index = _build_validation_index(profiles)
|
index = _build_validation_index(profiles)
|
||||||
path = self.files["no_md5.bin"]["path"]
|
path = self.files["no_md5.bin"]["path"]
|
||||||
reason = check_file_validation(path, "no_md5.bin", index)
|
result = check_file_validation(path, "no_md5.bin", index)
|
||||||
self.assertIsNotNone(reason)
|
self.assertIsNotNone(result)
|
||||||
|
reason, emus = result
|
||||||
self.assertIn("crc32 mismatch", reason)
|
self.assertIn("crc32 mismatch", reason)
|
||||||
|
self.assertIsInstance(emus, list)
|
||||||
|
|
||||||
def test_75_validation_applied_in_existence_mode(self):
|
def test_75_validation_applied_in_existence_mode(self):
|
||||||
"""Existence mode reports discrepancy when validation fails, keeps OK."""
|
"""Existence mode reports discrepancy when validation fails, keeps OK."""
|
||||||
@@ -1212,9 +1218,11 @@ class TestE2E(unittest.TestCase):
|
|||||||
profiles = load_emulator_profiles(self.emulators_dir)
|
profiles = load_emulator_profiles(self.emulators_dir)
|
||||||
index = _build_validation_index(profiles)
|
index = _build_validation_index(profiles)
|
||||||
path = self.files["alias_target.bin"]["path"]
|
path = self.files["alias_target.bin"]["path"]
|
||||||
reason = check_file_validation(path, "alias_target.bin", index)
|
result = check_file_validation(path, "alias_target.bin", index)
|
||||||
self.assertIsNotNone(reason)
|
self.assertIsNotNone(result)
|
||||||
|
reason, emus = result
|
||||||
self.assertIn("md5 mismatch", reason)
|
self.assertIn("md5 mismatch", reason)
|
||||||
|
self.assertIsInstance(emus, list)
|
||||||
|
|
||||||
def test_81_validation_index_has_md5_sha1(self):
|
def test_81_validation_index_has_md5_sha1(self):
|
||||||
"""Validation index stores md5 and sha1 when declared."""
|
"""Validation index stores md5 and sha1 when declared."""
|
||||||
@@ -3087,20 +3095,23 @@ class TestE2E(unittest.TestCase):
|
|||||||
"system": "test-system",
|
"system": "test-system",
|
||||||
"required": True,
|
"required": True,
|
||||||
"mode": "both",
|
"mode": "both",
|
||||||
|
"sha1": "aaaa",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "lr_only.bin",
|
"name": "lr_only.bin",
|
||||||
"system": "test-system",
|
"system": "test-system",
|
||||||
"required": True,
|
"required": True,
|
||||||
"mode": "libretro",
|
"mode": "libretro",
|
||||||
|
"sha1": "bbbb",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sa_only.bin",
|
"name": "sa_only.bin",
|
||||||
"system": "test-system",
|
"system": "test-system",
|
||||||
"required": True,
|
"required": True,
|
||||||
"mode": "standalone",
|
"mode": "standalone",
|
||||||
|
"sha1": "cccc",
|
||||||
},
|
},
|
||||||
{"name": "nomode.bin", "system": "test-system", "required": True},
|
{"name": "nomode.bin", "system": "test-system", "required": True, "sha1": "dddd"},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
with open(os.path.join(self.emulators_dir, "dualmode.yml"), "w") as f:
|
with open(os.path.join(self.emulators_dir, "dualmode.yml"), "w") as f:
|
||||||
@@ -3134,12 +3145,14 @@ class TestE2E(unittest.TestCase):
|
|||||||
"system": "test-system",
|
"system": "test-system",
|
||||||
"required": True,
|
"required": True,
|
||||||
"mode": "libretro",
|
"mode": "libretro",
|
||||||
|
"sha1": "aaaa",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sa_file.bin",
|
"name": "sa_file.bin",
|
||||||
"system": "test-system",
|
"system": "test-system",
|
||||||
"required": True,
|
"required": True,
|
||||||
"mode": "standalone",
|
"mode": "standalone",
|
||||||
|
"sha1": "bbbb",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
@@ -3175,6 +3188,7 @@ class TestE2E(unittest.TestCase):
|
|||||||
"system": "test-system",
|
"system": "test-system",
|
||||||
"required": False,
|
"required": False,
|
||||||
"source_ref": "a.cpp:10",
|
"source_ref": "a.cpp:10",
|
||||||
|
"sha1": "aaaa",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
@@ -3189,6 +3203,7 @@ class TestE2E(unittest.TestCase):
|
|||||||
"system": "test-system",
|
"system": "test-system",
|
||||||
"required": True,
|
"required": True,
|
||||||
"source_ref": "b.cpp:20",
|
"source_ref": "b.cpp:20",
|
||||||
|
"sha1": "aaaa",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
@@ -3377,10 +3392,17 @@ class TestE2E(unittest.TestCase):
|
|||||||
registry_path,
|
registry_path,
|
||||||
emulators_dir=self.emulators_dir,
|
emulators_dir=self.emulators_dir,
|
||||||
)
|
)
|
||||||
|
# Detect flat vs nested ZIP to build expected paths
|
||||||
base = manifest.get("base_destination", "")
|
base = manifest.get("base_destination", "")
|
||||||
|
is_flat = bool(base) and not any(
|
||||||
|
n.startswith(base + "/") for n in zip_names
|
||||||
|
)
|
||||||
manifest_dests = set()
|
manifest_dests = set()
|
||||||
for f in manifest["files"]:
|
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)
|
manifest_dests.add(d)
|
||||||
|
|
||||||
self.assertEqual(manifest_dests, zip_names)
|
self.assertEqual(manifest_dests, zip_names)
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import os
|
||||||
|
import unittest
|
||||||
|
from collections import defaultdict
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
||||||
|
BIOS_ROOT = REPO_ROOT / "bios"
|
||||||
|
|
||||||
|
|
||||||
|
class TestNoCaseCollisions(unittest.TestCase):
|
||||||
|
"""Guard against case-colliding paths in bios/.
|
||||||
|
|
||||||
|
On case-insensitive filesystems (Windows, macOS default), git can only
|
||||||
|
check out one path per casefold-equivalence class, silently corrupting
|
||||||
|
clones. Issue #33 and #49 both stemmed from this.
|
||||||
|
|
||||||
|
.variants/ subdirs are exempt: they intentionally hold genuine content
|
||||||
|
variants disambiguated by hash suffix (e.g., BIOS.ROM.910fae67).
|
||||||
|
"""
|
||||||
|
|
||||||
|
def test_bios_has_no_case_colliding_paths(self) -> None:
|
||||||
|
if not BIOS_ROOT.is_dir():
|
||||||
|
self.skipTest("bios/ directory not present")
|
||||||
|
|
||||||
|
collisions: list[str] = []
|
||||||
|
for root, dirs, files in os.walk(BIOS_ROOT):
|
||||||
|
if ".variants" in Path(root).parts:
|
||||||
|
continue
|
||||||
|
|
||||||
|
dir_groups: dict[str, list[str]] = defaultdict(list)
|
||||||
|
for d in dirs:
|
||||||
|
dir_groups[d.casefold()].append(d)
|
||||||
|
for variants in dir_groups.values():
|
||||||
|
if len(variants) > 1:
|
||||||
|
rel = Path(root).relative_to(REPO_ROOT)
|
||||||
|
collisions.append(f"DIR {rel}: {sorted(variants)}")
|
||||||
|
|
||||||
|
file_groups: dict[str, list[str]] = defaultdict(list)
|
||||||
|
for f in files:
|
||||||
|
file_groups[f.casefold()].append(f)
|
||||||
|
for variants in file_groups.values():
|
||||||
|
if len(variants) > 1:
|
||||||
|
rel = Path(root).relative_to(REPO_ROOT)
|
||||||
|
collisions.append(f"FILE {rel}: {sorted(variants)}")
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
collisions,
|
||||||
|
[],
|
||||||
|
"Case-colliding paths in bios/ would break Windows/macOS clones:\n"
|
||||||
|
+ "\n".join(collisions),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
@@ -324,10 +324,13 @@ python scripts/pipeline.py --offline
|
|||||||
This executes in sequence:
|
This executes in sequence:
|
||||||
|
|
||||||
1. `generate_db.py` - rebuild `database.json` from `bios/`
|
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
|
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
|
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:
|
Check the output for:
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ Upstream sources Scrapers parse generate_db.py scans
|
|||||||
batocera-systems builds database.json
|
batocera-systems builds database.json
|
||||||
es_bios.xml (recalbox) (SHA1 primary key,
|
es_bios.xml (recalbox) (SHA1 primary key,
|
||||||
core-info .info files indexes: by_md5, by_name,
|
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
|
MAME/FBNeo source
|
||||||
|
|
||||||
emulators/*.yml verify.py checks generate_pack.py resolves
|
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
|
## Tests
|
||||||
|
|
||||||
5 test files, 249 tests total:
|
5 test files, 259 tests total:
|
||||||
|
|
||||||
| File | Tests | Coverage |
|
| 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_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_mame_parser.py` | 22 | BIOS root set detection, ROM block parsing, macro expansion |
|
||||||
| `test_fbneo_parser.py` | 16 | BIOS set detection, ROM info parsing |
|
| `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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| Weekly Sync | `watch.yml` | cron (Monday 6 AM UTC) + manual | scrape upstream sources, detect changes, create update PR |
|
||||||
|
|||||||
@@ -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.
|
||||||
+5
-3
@@ -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` |
|
| SHA1 | 40 hex chars | `10155d8d6e6e832d8ea1571511e40dfb15fede05` |
|
||||||
| CRC32 | 8 hex chars | `2F468B96` |
|
| 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?
|
## 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?
|
## 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
|
### RetroDECK
|
||||||
|
|
||||||
```
|
```
|
||||||
~/.var/app/net.retrodeck.retrodeck/retrodeck/bios/
|
~/retrodeck/bios/
|
||||||
```
|
```
|
||||||
|
|
||||||
### EmuDeck
|
### EmuDeck
|
||||||
|
|||||||
+5
-1
@@ -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.
|
See [contributing](../contributing.md) for submission guidelines.
|
||||||
|
|
||||||
|
## Community
|
||||||
|
|
||||||
|
- **[Community tools](community-tools.md)** - projects built on RetroBIOS data
|
||||||
|
|
||||||
## Glossary
|
## Glossary
|
||||||
|
|
||||||
- **BIOS** - firmware burned into console hardware, needed by emulators that rely on original boot code
|
- **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
|
- **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
|
- **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.)
|
- **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
|
- **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
|
- **profile** - a YAML file in `emulators/` documenting one core's BIOS requirements, verified against source code
|
||||||
|
|||||||
+5
-1
@@ -250,7 +250,7 @@ even if documentation mentions it.
|
|||||||
|-------|----------|-------------|
|
|-------|----------|-------------|
|
||||||
| `emulator` | yes | display name |
|
| `emulator` | yes | display name |
|
||||||
| `type` | yes | `libretro`, `standalone`, `standalone + libretro`, `alias`, `launcher`, `game`, `utility`, `test` |
|
| `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 |
|
| `source` | yes | libretro core repository URL |
|
||||||
| `upstream` | no | original emulator repository URL |
|
| `upstream` | no | original emulator repository URL |
|
||||||
| `profiled_date` | yes | date of source analysis |
|
| `profiled_date` | yes | date of source analysis |
|
||||||
@@ -276,6 +276,7 @@ even if documentation mentions it.
|
|||||||
| `size` | expected size in bytes |
|
| `size` | expected size in bytes |
|
||||||
| `min_size`, `max_size` | size range when the code accepts a range |
|
| `min_size`, `max_size` | size range when the code accepts a range |
|
||||||
| `md5`, `sha1`, `crc32`, `sha256` | expected hashes from source code |
|
| `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 |
|
| `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 |
|
| `aliases` | alternate filenames for the same file |
|
||||||
| `mode` | `libretro`, `standalone`, or `both` |
|
| `mode` | `libretro`, `standalone`, or `both` |
|
||||||
@@ -288,4 +289,7 @@ even if documentation mentions it.
|
|||||||
| `note` | additional context |
|
| `note` | additional context |
|
||||||
| `contents` | structure of files inside a BIOS ZIP (`name`, `description`, `size`, `crc32`) |
|
| `contents` | structure of files inside a BIOS ZIP (`name`, `description`, `size`, `crc32`) |
|
||||||
| `storage` | `large_file` for files > 50 MB stored as release assets |
|
| `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 |
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ Run everything in sequence:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
python scripts/pipeline.py --offline # DB + verify + packs + manifests + integrity + readme + site
|
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 --skip-docs # skip readme + site generation
|
||||||
python scripts/pipeline.py --offline --target switch # filter by hardware target
|
python scripts/pipeline.py --offline --target switch # filter by hardware target
|
||||||
python scripts/pipeline.py --offline --with-truth # include truth generation + diff
|
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:**
|
**Check if the hash matches:**
|
||||||
|
|
||||||
Look for `HASH_MISMATCH` in the verify output. This means the file exists but
|
Look for `untested` entries in the verify output. This means the file exists but
|
||||||
contains different data than expected. Common causes:
|
its hash does not match the expected value. Common causes:
|
||||||
|
|
||||||
- Wrong region (a PAL BIOS instead of NTSC, or vice versa)
|
- Wrong region (a PAL BIOS instead of NTSC, or vice versa)
|
||||||
- Wrong hardware revision (e.g. SCPH-5501 vs SCPH-1001 for PlayStation)
|
- Wrong hardware revision (e.g. SCPH-5501 vs SCPH-1001 for PlayStation)
|
||||||
@@ -72,13 +72,11 @@ filename from the emulator profile.
|
|||||||
|
|
||||||
## Hash mismatch / UNTESTED
|
## Hash mismatch / UNTESTED
|
||||||
|
|
||||||
`verify.py` reports `HASH_MISMATCH` or `UNTESTED` for a file.
|
`verify.py` reports `UNTESTED` for a file.
|
||||||
|
|
||||||
**HASH_MISMATCH:**
|
|
||||||
|
|
||||||
The file exists and was hashed, but the computed hash doesn't match any expected
|
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
|
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
|
To find the correct version, check the system page on the site. It lists every
|
||||||
known BIOS file with its expected MD5 and SHA1.
|
known BIOS file with its expected MD5 and SHA1.
|
||||||
@@ -147,10 +145,11 @@ How to read and interpret `verify.py` output.
|
|||||||
| Status | Meaning |
|
| Status | Meaning |
|
||||||
|--------|---------|
|
|--------|---------|
|
||||||
| `ok` | File present, hash matches (or existence check passed) |
|
| `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 |
|
| `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:**
|
**Reading the output:**
|
||||||
|
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ Recalbox uses three severity levels derived from two YAML fields (`mandatory` an
|
|||||||
|-----------|--------------------|--------|-------------------|
|
|-----------|--------------------|--------|-------------------|
|
||||||
| true | true | RED | CRITICAL |
|
| true | true | RED | CRITICAL |
|
||||||
| true | false | YELLOW | WARNING |
|
| true | false | YELLOW | WARNING |
|
||||||
| false | (any) | GREEN | INFO |
|
| false | (any) | GREEN | WARNING |
|
||||||
|
|
||||||
### checkInsideZip (Batocera zippedFile)
|
### 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 verification
|
||||||
|
|
||||||
RomM checks both file size and hash. It accepts any hash type (MD5, SHA1, or CRC32).
|
RomM uses MD5 verification (`verification_mode: md5`). The platform YAML stores
|
||||||
ZIP files are not opened; only the container is checked. `verify.py` replicates this
|
SHA1, MD5, and CRC32 for reference, but `verify.py` checks only the MD5 field,
|
||||||
by checking size first, then trying each available hash.
|
matching the platform's runtime behavior. ZIP files are not opened; only the
|
||||||
|
container is checked.
|
||||||
|
|
||||||
|
|
||||||
## SHA1 Mode
|
## SHA1 Mode
|
||||||
|
|||||||
Reference in New Issue
Block a user