mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-04-13 12:22:33 -05:00
Compare commits
18 Commits
0401d058a1
...
v2026.04.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ce4724fc4 | ||
|
|
7e46c23f3a | ||
|
|
6f22dd7738 | ||
|
|
c0e42ee4eb | ||
|
|
92b270c054 | ||
|
|
2f11542ed3 | ||
|
|
f9a612db4a | ||
|
|
812775f6b4 | ||
|
|
73ccb216f5 | ||
|
|
5ee81b30c6 | ||
|
|
b5eae226cd | ||
|
|
fd4606885e | ||
|
|
ded903ed7a | ||
|
|
077392bcd9 | ||
|
|
f4626ce3bd | ||
|
|
9e184f76fc | ||
|
|
fa0ed63718 | ||
|
|
c3fa55bd46 |
36
.github/workflows/build.yml
vendored
36
.github/workflows/build.yml
vendored
@@ -58,16 +58,32 @@ jobs:
|
||||
run: |
|
||||
mkdir -p .cache/large
|
||||
gh release download large-files -D .cache/large/ 2>/dev/null || true
|
||||
for f in .cache/large/*; do
|
||||
[ -f "$f" ] || continue
|
||||
name=$(basename "$f")
|
||||
target=$(grep "$name" .gitignore | head -1)
|
||||
if [ -n "$target" ] && [ ! -f "$target" ]; then
|
||||
mkdir -p "$(dirname "$target")"
|
||||
cp "$f" "$target"
|
||||
echo "Restored: $target"
|
||||
fi
|
||||
done
|
||||
python3 -c "
|
||||
import hashlib, json, os, shutil
|
||||
db = json.load(open('database.json'))
|
||||
with open('.gitignore') as f:
|
||||
ignored = {l.strip() for l in f if l.strip().startswith('bios/')}
|
||||
cache = '.cache/large'
|
||||
if not os.path.isdir(cache):
|
||||
exit(0)
|
||||
idx = {}
|
||||
for fn in os.listdir(cache):
|
||||
fp = os.path.join(cache, fn)
|
||||
if os.path.isfile(fp):
|
||||
h = hashlib.sha1(open(fp, 'rb').read()).hexdigest()
|
||||
idx[h] = fp
|
||||
restored = 0
|
||||
for sha1, entry in db['files'].items():
|
||||
path = entry['path']
|
||||
if path in ignored and not os.path.exists(path):
|
||||
src = idx.get(sha1)
|
||||
if src:
|
||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||
shutil.copy2(src, path)
|
||||
print(f'Restored: {path}')
|
||||
restored += 1
|
||||
print(f'Total: {restored} files restored')
|
||||
"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
||||
37
.github/workflows/deploy-site.yml
vendored
37
.github/workflows/deploy-site.yml
vendored
@@ -36,6 +36,43 @@ jobs:
|
||||
|
||||
- run: pip install pyyaml mkdocs-material pymdown-extensions
|
||||
|
||||
- name: Restore large files from release
|
||||
run: |
|
||||
mkdir -p .cache/large
|
||||
gh release download large-files -D .cache/large/ 2>/dev/null || true
|
||||
python3 -c "
|
||||
import hashlib, json, os, shutil
|
||||
db = json.load(open('database.json'))
|
||||
with open('.gitignore') as f:
|
||||
ignored = {l.strip() for l in f if l.strip().startswith('bios/')}
|
||||
cache = '.cache/large'
|
||||
if not os.path.isdir(cache):
|
||||
exit(0)
|
||||
idx = {}
|
||||
for fn in os.listdir(cache):
|
||||
fp = os.path.join(cache, fn)
|
||||
if os.path.isfile(fp):
|
||||
h = hashlib.sha1(open(fp, 'rb').read()).hexdigest()
|
||||
idx[h] = fp
|
||||
restored = 0
|
||||
for sha1, entry in db['files'].items():
|
||||
path = entry['path']
|
||||
if path in ignored and not os.path.exists(path):
|
||||
src = idx.get(sha1)
|
||||
if src:
|
||||
os.makedirs(os.path.dirname(path), exist_ok=True)
|
||||
shutil.copy2(src, path)
|
||||
print(f'Restored: {path}')
|
||||
restored += 1
|
||||
print(f'Total: {restored} files restored')
|
||||
"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Refresh data directories
|
||||
run: python scripts/refresh_data_dirs.py
|
||||
continue-on-error: true
|
||||
|
||||
- name: Generate site
|
||||
run: |
|
||||
python scripts/generate_site.py
|
||||
|
||||
@@ -7,6 +7,16 @@
|
||||
3. Variants (alternate hashes): `bios/Manufacturer/Console/.variants/`
|
||||
4. Create a Pull Request - checksums are verified automatically
|
||||
|
||||
## Add a new platform
|
||||
|
||||
1. Write a scraper in `scripts/scraper/`
|
||||
2. Create the platform YAML in `platforms/`
|
||||
3. Register in `platforms/_registry.yml`
|
||||
4. Submit a Pull Request
|
||||
|
||||
Contributors who add platform support are credited in the README,
|
||||
on the documentation site, and in the BIOS packs.
|
||||
|
||||
## File conventions
|
||||
|
||||
- Files >50 MB go in GitHub release assets (`large-files` release)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
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
|
||||
|
||||
@@ -46,7 +46,7 @@ Each file is checked against the emulator's source code to match what the code a
|
||||
- **10 platforms** supported with platform-specific verification
|
||||
- **329 emulators** profiled from source (RetroArch cores + standalone)
|
||||
- **396 systems** covered (NES, SNES, PlayStation, Saturn, Dreamcast, ...)
|
||||
- **7,295 files** verified with MD5, SHA1, CRC32 checksums
|
||||
- **7,302 files** verified with MD5, SHA1, CRC32 checksums
|
||||
- **8765 MB** total collection size
|
||||
|
||||
## Supported systems
|
||||
@@ -130,4 +130,4 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
||||
|
||||
This repository provides BIOS files for personal backup and archival purposes.
|
||||
|
||||
*Auto-generated on 2026-03-31T20:38:37Z*
|
||||
*Auto-generated on 2026-04-02T13:38:26Z*
|
||||
|
||||
BIN
bios/Dragon/Dragon/delta2.rom
Normal file
BIN
bios/Dragon/Dragon/delta2.rom
Normal file
Binary file not shown.
BIN
bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d
Normal file
BIN
bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d
Normal file
Binary file not shown.
BIN
bios/Other/NXEngine/nxengine/data/sprites.sif
Normal file
BIN
bios/Other/NXEngine/nxengine/data/sprites.sif
Normal file
Binary file not shown.
BIN
bios/Other/NXEngine/nxengine/tilekey.dat
Normal file
BIN
bios/Other/NXEngine/nxengine/tilekey.dat
Normal file
Binary file not shown.
BIN
bios/Sony/PlayStation/.variants/scph3000.bin.e38466a4
Normal file
BIN
bios/Sony/PlayStation/.variants/scph3000.bin.e38466a4
Normal file
Binary file not shown.
BIN
bios/Sony/PlayStation/.variants/scph3500.bin.ffa7f9a7
Normal file
BIN
bios/Sony/PlayStation/.variants/scph3500.bin.ffa7f9a7
Normal file
Binary file not shown.
BIN
bios/Texas Instruments/TI-99/Gram Kracker.ctg
Normal file
BIN
bios/Texas Instruments/TI-99/Gram Kracker.ctg
Normal file
Binary file not shown.
BIN
bios/Texas Instruments/TI-99/cf7+.ctg
Normal file
BIN
bios/Texas Instruments/TI-99/cf7+.ctg
Normal file
Binary file not shown.
BIN
bios/Texas Instruments/TI-99/ti-pcard.ctg
Normal file
BIN
bios/Texas Instruments/TI-99/ti-pcard.ctg
Normal file
Binary file not shown.
301
bios/sdlpal/desc.dat
Normal file
301
bios/sdlpal/desc.dat
Normal file
@@ -0,0 +1,301 @@
|
||||
本說明檔由 Eric-Chen 整理
|
||||
http://hi.baidu.com/eric_chensoft
|
||||
|
||||
適用於 SDLPAL (http://sdlpal.codeplex.com)
|
||||
|
||||
3d(觀音符)=以觀音聖水書寫的靈符。*HP+150
|
||||
3e(聖靈符)=具有女媧神強大靈力的符咒。*全體HP+300
|
||||
3f(金剛符)=使用後如有金鐘鐵罩護身。*增加防禦七回合。
|
||||
40(淨衣符)=具有祛病、驅邪的法力,*可解赤毒、屍毒、瘴毒。
|
||||
41(靈心符)=具有寧神、驅邪的靈效,*可解瘋魔、妖縛、昏睡、封咒。
|
||||
42(天師符)=茅山道士用來對付妖怪的符咒。
|
||||
43(風靈符)=產生風系法術的符咒。
|
||||
44(雷靈符)=產生雷系法術的符咒。
|
||||
45(水靈符)=產生冰系法術的符咒。
|
||||
46(火靈符)=產生火系法術的符咒。
|
||||
47(土靈符)=產生土系法術的符咒。
|
||||
48(舍利子)=得道高僧佛身火化後,*結成如珠狀的東西。*最大真氣值+3
|
||||
49(玉菩提)=墨玉菩提樹的種籽。*最大真氣值+5
|
||||
4a(銀杏子)=銀杏樹所結的白色核果。*最大體力值+3
|
||||
4b(糯米)=糯稻的米,富於黏性,*可解屍毒。
|
||||
4c(糯米糕)=糯米加麥芽、甜豆所煮的米糕,*可解屍毒。HP+25
|
||||
4d(鹽巴)=取海水煎熬或曝曬而成,用來調*味,有時可解毒。
|
||||
4e(茶葉蛋)=雞蛋水煮後,以茶葉入味。*便宜而好吃的食物。*HPMP+15
|
||||
4f(雞蛋)=便宜而常見的食物。*HPMP+10
|
||||
50(糖葫蘆)=以竹簽串李子,裹上麥芽糖,*形如葫蘆,故稱「糖葫蘆」。*HPMP+22
|
||||
51(蠟燭)=用蠟製的點火照明的東西。
|
||||
52(符紙)=泛黃的空白符紙。
|
||||
53(檀香)=含有檀香料的一種香,點燃用以*薰衣、薰室內,驅逐惡氣。
|
||||
54(大蒜)=具有除穢、祛病、護身等功能,*可以入藥。*戰鬥中服食避毒率+30%
|
||||
56(酒)=以米加酒麴釀製而成,*可解赤毒。HPMP+15
|
||||
57(雄黃)=天然產的礦物,塊狀、色黃,*可解赤毒。
|
||||
58(雄黃酒)=一點點的雄黃,撒在酒中,*習俗在端午節喝這種酒;*可解赤毒、瘴毒。
|
||||
59(九節菖蒲)=一種水草,葉子狹長如劍,*可解赤毒、屍毒、瘴毒、毒絲。
|
||||
5a(驅魔香)=以大蒜、雄黃、艾草、檀香等混合*煉製而成,點燃後發出魔物厭惡*的氣味,使魔物不敢接近。
|
||||
5b(十里香)=以生血、內藏、肉桂等煉製,*點燃後散發出吸引魔物的香味。
|
||||
5c(水果)=養顏美容、幫助消化。*HPMP+20
|
||||
5d(燒肉)=以炭火熏烤的醬汁豬肉。*HPMP+30
|
||||
5e(醃肉)=用鹽巴醃漬的豬肉。*HP+85
|
||||
5f(還魂香)=點燃後會散發奇異的香氣,*能牽引離體魂魄回歸軀體。*HP恢復10%
|
||||
60(贖魂燈)=以蓮燈作法與鬼差交涉,*贖回死者魂魄。*HP恢復30%
|
||||
61(孟婆湯)=消除死者罪孽業障,*使死者復活。*HP恢復50%
|
||||
62(天香續命露)=以大量珍貴秘藥精煉而成,*具有肉白骨、藥死人之奇效。*HP恢復100%
|
||||
63(止血草)=嚼碎後敷在傷口上,可迅速止血。*HP+50
|
||||
64(行軍丹)=活血順氣的藥丸。*HP+100
|
||||
65(金創藥)=上等刀傷藥,去腐生肌。*HP+200
|
||||
66(蟠果)=西王母蟠桃園遺種,*籽小肉厚汁液香甜。*HP+450
|
||||
67(紫菁玉蓉膏)=依宮廷秘方,采珍貴藥材煉製,*是療傷藥的極品。*HP+1000
|
||||
68(鼠兒果)=產於山間野地,多為鼠類所食,*經人發現移種平地。*MP+36
|
||||
69(還神丹)=寧神醒腦的藥丸。*MP+50
|
||||
6a(龍涎草)=經蛟龍唾涎灌溉而生,*具有補中益氣之療效。*MP+110
|
||||
6b(靈山仙芝)=寄生於枯木上的菌類,俗稱瑞草,*具有養氣培元之神效。*MP+260
|
||||
6c(雪蓮子)=白玉雪蓮之蓮子,其形珠圓玉潤,*服食者真氣充盈,經脈通暢。*MP+400
|
||||
6d(天仙玉露)=觀音菩薩淨瓶甘露水,*人間難求的仙界聖藥。*MP+700
|
||||
6e(神仙茶)=神仙廣成子養生延壽之秘方。*HPMP+440
|
||||
6f(靈葫仙丹)=修道隱士所煉丹藥。*HPMP+250
|
||||
70(試煉果)=藥王神農氏嘗百草時,*最早發現的珍藥。*靈力最大值+3
|
||||
71(女媧石)=女神媧皇煉石補天後,*所遺之五色石。*防禦最大值+3
|
||||
72(八仙石)=八仙石洞中所采集之丹礦。*防禦最大值+2
|
||||
73(蜂巢)=蜜蜂的窩,可以拿來丟敵人。
|
||||
74(屍腐肉)=沾染屍毒的腐敗肉塊。*毒性: 屍毒
|
||||
75(毒蛇卵)=煉蠱的材料。*毒性: 赤毒
|
||||
76(毒蠍卵)=煉蠱的材料。*毒性: 赤毒
|
||||
77(毒蟾卵)=煉蠱的材料。*毒性: 赤毒
|
||||
78(蜘蛛卵)=煉蠱的材料。*毒性: 赤毒
|
||||
79(蜈蚣卵)=煉蠱的材料。*毒性: 赤毒
|
||||
7a(鶴頂紅)=七大毒蠱,中毒後每回合損血,*至死方休。*解藥: 血海棠 致命藥引: 孔雀膽
|
||||
7b(孔雀膽)=七大毒蠱,中毒後每回合損血,*至死方休。*解藥: 金蠶蠱 致命藥引: 鶴頂紅
|
||||
7c(血海棠)=七大毒蠱,中毒後每回合損血,*至死方休。*解藥: 斷腸草 致命藥引: 三屍蠱
|
||||
7d(斷腸草)=七大毒蠱,中毒後每回合損血,*至死方休。*解藥: 三屍蠱 致命藥引: 金蠶蠱
|
||||
7e(醍醐香)=紫葉小白花,散發濃鬱香氣,*聞到香氣,便如酒醉一般。*妖縛四回合。
|
||||
7f(忘魂花)=青藍色小花,散發淡淡香氣,*聞到香氣,便會渾然忘我、*昏睡三回合。
|
||||
80(紫罌粟)=服食者會產生幻覺,敵我不分。*瘋魔四回合。
|
||||
81(鬼枯藤)=具毒性的黑褐色野生藤蔓,*可解赤毒、屍毒、瘴毒、毒絲。*HP-30
|
||||
82(腹蛇涎)=腹蛇的毒涎。*毒性: 瘴毒
|
||||
83(蜂王蜜)=蜜蜂所釀最好的蜜。*HPMP+150
|
||||
84(雪蛤蟆)=生長於天山極寒之地,僅銅錢般大*小。武術最大值+2 防禦最大值+2*靈力最大值+2
|
||||
85(赤蠍粉)=以整只赤尾蠍研磨成的粉末,*可使敵方全體中赤毒。
|
||||
86(化屍水)=碰到傷口血水,便腐蝕潰爛,*受傷者沾染立斃。
|
||||
87(迷魂香)=點燃蒙汗藥散發迷香,*可使敵人昏睡五回合。
|
||||
88(九陰散)=服食前若已中毒,可補滿體力,*但無法解毒;*服食前若沒中毒,即刻斃命。
|
||||
89(無影毒)=七大毒蠱,中毒後立即發作,*耗損一半體力。
|
||||
8a(三屍蠱)=七大毒蠱;中毒後,潛伏片刻即*會發作,毒性非常猛烈。*解藥: 孔雀膽 致命藥引: 血海棠
|
||||
8b(金蠶蠱)=七大毒蠱,中毒後每回合損血,*至死方休。*解藥: 鶴頂紅 致命藥引: 斷腸草
|
||||
8c(幻蠱)=分泌的毒液會影響人的腦部,*使人敵我不分,*瘋魔五回合。
|
||||
8d(隱蠱)=如帶刺甲蟲,將其身體捏破,*散發之煙霧可助我方隱匿形跡。*全體隱形三回合。
|
||||
8e(冰蠶蠱)=以雪山冰洞內所產所冰蠶培養的*蠱蟲,可做為攻擊道具。
|
||||
8f(火蠶蠱)=以麒麟炎洞內所產火蠶所培養的*蠱蟲,可做為攻擊道具。
|
||||
90(食妖蟲)=寄生宿主吸取靈氣,九回合後,*可煉成靈蠱。
|
||||
91(靈蠱)=以稀有藥物豢養的雌蠱。*全體MP+250
|
||||
92(爆烈蠱)=預先將法力灌輸在蠱蟲體內,*投擲敵人產生強烈爆炸。
|
||||
93(碧血蠶)=寄生宿主吸取血液,九回合後,*可煉成赤血蠶。
|
||||
94(蠱)=巫師施法所需的材料。
|
||||
95(赤血蠶)=吸血維生的毒蠱,*服食後體力完全恢復。
|
||||
96(金蠶王)=蠱中之王,月夜散發金色磷光,*服食後可提升修行。
|
||||
97(引路蜂)=跟隨引路蜂而行,*可回到迷宮起點。
|
||||
98(傀儡蟲)=湘西雲貴巫師用以控制屍體,*可使死者繼續攻擊九回合。
|
||||
99(梅花鏢)=形如梅花的暗器。*敵人HP-90
|
||||
9a(袖裏劍)=暗藏在衣袖中的飛劍。*敵人HP-170
|
||||
9b(透骨釘)=精鐵打造、三寸長的鐵針是*很鋒利的暗器。*敵人HP-250
|
||||
9c(雷火珠)=填充火藥的鐵珠,投擲撞擊*後會爆裂傷人。*敵人HP-135
|
||||
9d(毒龍砂)=以腹蛇毒煉製成的細砂,*可使敵方全體中瘴毒。*HP-55
|
||||
9e(吸星鎖)=鐵製鋼抓,尾端系以靈蠱蠶絲,*可吸取敵人HP180
|
||||
9f(纏魂絲)=千年蜘蛛的毒絲。*毒性: 毒絲
|
||||
a0(捆仙繩)=施有咒術的粗麻繩,*可令妖怪動彈不得,*妖縛五回合。
|
||||
a1(無影神針)=細如牛毛,傷人於無形。*敵人HP-400
|
||||
a2(血玲瓏)=紅色鐵球,四周裝有鋒利刀片。*敵方全體HP-300
|
||||
a3(長鞭)=生牛皮製的七尺軟鞭。*武術+20 身法+20
|
||||
a4(九截鞭)=以鐵節鐵環組成的九節軟鞭。*武術+66 身法+33
|
||||
a5(金蛇鞭)=以蛇皮絞以金絲編織成九尺軟鞭。*武術+99 身法+60
|
||||
a6(木劍)=用木材雕刻的劍,小孩玩具。*武術+2 身法+3
|
||||
a7(短刀)=一尺半長的鈍刀,可用來劈*砍木材。*武術+6 身法-5
|
||||
a8(鐵劍)=一般鐵匠大量生產的劍,打造*得頗為粗劣。*武術+10 防禦+3
|
||||
a9(大刀)=刀身寬而長,刃部鋒利,*背部厚重。*武術+16 防禦+1
|
||||
aa(仙女劍)=一尺長的雙手劍,適合女子*使用,可發出兩次攻擊。*武術+8 防禦+5
|
||||
ab(長劍)=一般鐵匠接受訂造的劍,*比鐵劍精致鋒利。*武術+25
|
||||
ac(紅纓刀)=精鋼打造,背厚刃薄,*刀柄飾以紅色長穗。*武術+38
|
||||
ad(越女劍)=劍身寬僅兩指,*專為女子打造。*武術+22 身法+8
|
||||
ae(戒刀)=佛門中人練武所用之刀,*嚴禁傷生染血。*武術+55 防禦+5 靈力+10
|
||||
af(玄鐵劍)=以珍貴的黑色鐵礦打造而成,*堅韌鋒利但極笨重。*武術+70 身法-20 靈力-15 防禦+9
|
||||
b0(芙蓉刀)=百花派獨門兵器雙手彎刀,*可發出兩次攻擊。*武術+16 身法+8
|
||||
b1(柳月刀)=細長鐵製雙刀,形如柳葉新月,*可發出兩次攻擊。*武術+28 身法+12 防禦+3
|
||||
b2(青鋒劍)=名家精心打造的劍,輕薄鋒利。*武術+75 身法+15
|
||||
b3(苗刀)=苗族戰士所慣用的佩刀。*武術+70 身法+32
|
||||
b4(鳳鳴刀)=出鞘之聲有如鳳鳴,*故稱「鳳鳴刀」。武術+124*防禦+9 身法+32 靈力+16
|
||||
b5(雙龍劍)=與一般劍長度相同的雙手劍,*可發出兩次攻擊。*武術+62 防禦+9 身法+9
|
||||
b6(玉女劍)=鴛鴦雙劍中的雌劍,與金童劍為*一對。武術+100 靈力+15*身法+20 吉運+30
|
||||
b7(金童劍)=鴛鴦雙劍中的雄劍,與玉女劍為*一對。武術+100 吉運+30*身法+20 靈力+15 防禦+3
|
||||
b8(龍泉劍)=龍泉的水質非常適合造劍,*當地生產的劍叫龍泉劍。*武術+88 身法+20 吉運+22
|
||||
b9(鬼牙刀)=苗刀的一種,刀尖倒鉤,*又稱「勾魂刀」。*武術+90 身法+26 吉運-9
|
||||
ba(七星劍)=劍身鑲嵌七顆金黃寶石,可吸取北*斗七星之精氣。武術+120 靈力+50*身法+32 吉運+33 防禦+7
|
||||
bb(玄冥寶刀)=可連續攻擊敵方全體兩次,*傳說是魔族的邪異兵器。*武術+98 身法+98 吉運+98
|
||||
bc(巫月神刀)=苗族拜月教鎮教之寶。*武術+132 靈力+55 防禦+29*身法+45 吉運+36
|
||||
bd(盤龍劍)=鑄劍宗師歐冶子所煉寶劍,劍身鑄*有青龍盤柱。武術+134 靈力+37*防禦+8 身法+40 吉運+32
|
||||
be(太極劍)=道祖張陵之隨身配劍,天師仗以降*妖伏魔。武術+158 靈力+90*防禦+35 身法+50 吉運+33
|
||||
bf(無塵劍)=上古神劍,指天天崩、劃地地裂。*武術+200 防禦+20 身法+77*吉運+33
|
||||
c0(青蛇杖)=雕刻雙蛇纏繞的綠玉杖。*武術+50 靈力+62 防禦+6
|
||||
c1(鬼頭杖)=苗族巫師役鬼煉蠱之法器,*頭顱中囚禁四十九條生魂。*武術+70 靈力+88 防禦+11
|
||||
c2(冥蛇杖)=來自冥界之魔杖,號令群邪,*杖頭鑲嵌千年蛇王內丹。*武術+88 靈力+120 防禦+22
|
||||
c3(天蛇杖)=女神媧皇煉化五色石所用法杖。*武術+100 靈力+150 防禦+33*吉運+36
|
||||
c4(頭巾)=以剩餘布料縫製的頭巾。*防禦+1
|
||||
c5(青絲巾)=青色的絲織髮帶。*防禦+2
|
||||
c6(髮飾)=錫製的女子頭飾。*防禦+3
|
||||
c7(銀釵)=純銀的髮釵。*防禦+5
|
||||
c8(翠玉金釵)=鑲有綠翡翠的黃金髮釵。*防禦+9
|
||||
c9(皮帽)=羊皮縫製的帽子,非常保暖。*防禦+4
|
||||
ca(珍珠冠)=以珍珠縫綴的紅色錦冠。*防禦+13
|
||||
cb(天師帽)=道士做法時所戴的帽子。*防禦+11 靈力+3
|
||||
cc(紫金冠)=紫金冠以薄銅片鑄成,*外殼以紫飾金而成。*防禦+18
|
||||
cd(天蠶絲帶)=以極珍貴的天蠶絲織成,*輕薄柔韌。*防禦+25 身法+8
|
||||
ce(鳳凰羽毛)=金翅鳳凰腹部的銀色羽毛。*防禦+7 身法+24 吉運+9
|
||||
cf(沖天冠)=天兵神將遺留的護頭金盔,*頂插雙雉尾羽。*防禦+28法+5 靈力+3 吉運+3
|
||||
d0(布袍)=粗布縫製的交領長袖白袍。*防禦+3
|
||||
d1(藤甲)=以荊藤編製的護甲。*防禦+7
|
||||
d2(絲衣)=以蠶絲紡織而成,輕柔透氣。*防禦+3 身法+4
|
||||
d3(鐵鎖衣)=以鐵環扣鎖製成的護甲。*防禦+13 身法-10
|
||||
d4(夜行衣)=暗黑色的緊身衣靠,*便於隱匿夜色之中。*防禦+18 身法+12 吉運+12
|
||||
d5(青銅甲)=青銅製的獸面紋胸護甲。*防禦+22 身法-13
|
||||
d6(羅漢袍)=修行得道的和尚所穿的衣袍。*防禦+10 吉運+10 靈力+10
|
||||
d7(鐵鱗甲)=以魚鱗形甲片編綴而成的鎧甲。*防禦+28 身法-4
|
||||
d8(天師道袍)=天師道祖修行時所穿的法衣。*防禦+33 靈力+28
|
||||
d9(精鐵戰甲)=以橢圓形的精鐵片編綴而成,*光亮照人,*又稱「光明鎧」。防禦+40 身法-7
|
||||
da(金縷衣)=以金線穿玉片編製而成*又稱「金縷玉衣」。*防禦+7 身法-10
|
||||
db(鬼針冑)=長滿倒刺的銅製盔甲。*防禦+55 武術+9
|
||||
dc(天蠶寶衣)=以極珍貴的天蠶絲織成,*輕薄柔韌。*防禦+66
|
||||
dd(青龍寶甲)=龍鱗編綴而成,世間絕頂*戰甲。*防禦+90
|
||||
de(白虎之鎧)=以罕見的白虎皮製成的皮甲。*防禦+80
|
||||
df(玄武戰袍)=以玄武的殼甲鍛造而成,*材質堅韌色黑而無光澤。*防禦+80
|
||||
e0(朱雀戰衣)= 以南方火鳥的羽毛編織而成。*防禦+80
|
||||
e1(披風)=無領對襟、無袖的披衣,*俗稱「斗篷」。*防禦+2
|
||||
e2(護肩)=披於肩臂上的鎧甲,*又稱「掩膊」。*防禦+6
|
||||
e3(武士披風)=將帥所穿有護肩軟甲的戰帔。*防禦+12
|
||||
e4(護心鏡)=防護前胸要害的披甲,形如*銅鏡。防禦+20
|
||||
e5(霓虹羽衣)=東海霓虹鳥的羽毛織成的*披肩。*防禦+18 身法+18 吉運+18
|
||||
e6(菩提袈裟)=高等僧衣,又名「無垢衣」,*多為高僧與長老所穿。*防禦+31 靈力+16
|
||||
e7(虎紋披風)=以整張千年白額虎虎皮製成,*毛皮呈黃色,帶黑色橫紋。*防禦+40
|
||||
e8(鳳紋披風)=相傳為織女縫製的披風,*繡鳳織錦,光彩奪目。*防禦+52
|
||||
e9(龍紋披風)=布面繡雙龍搶珠之彩紋,*有神龍護體之功效。*防禦+60
|
||||
ea(聖靈披風)=巫后的遺物,潛藏神聖的力*量。防禦+66 靈力+30
|
||||
eb(草鞋)=以藺草編織而成,十分便宜,*穿起來很輕便,適宜行走。*防禦+1
|
||||
ec(木鞋)=以木材削製而成,鞋面刻有吉祥*圖案。*防禦+2
|
||||
ed(布靴)=粗布縫製的長統靴。*防禦+3 身法+2
|
||||
ee(繡花鞋)=以絲緞縫製,鞋面繡有龍頭鳳尾*花。*防禦+4
|
||||
ef(鐵履)=鞋底夾縫鐵片,較普通布靴重。*防禦+6
|
||||
f0(武僧靴)=羅漢僧練武所穿的布靴。*防禦+8 身法+6
|
||||
f1(鹿皮靴)=鞋面以鹿皮毛縫製,質地輕柔,*行動可如鹿般迅捷。*防禦+11 身法+9
|
||||
f2(疾風靴)=以薄如雲霧的蟬紗織成,*助穿者疾行如風。*防禦+14 身法+17
|
||||
f3(蓮花靴)=飾以金蓮的長統繡花鞋。*防禦+18 身法+5
|
||||
f4(虎皮靴)=取自東北虎的皮毛縫製。*防禦+21 身法+16
|
||||
f5(龍鱗靴)=以龍鱗編綴而成。*防禦+25 身法+12
|
||||
f6(步雲靴)=雲中子羽化登仙後,*所遺留之神靴。*防禦+28 身法+20
|
||||
f7(魅影神靴)=妖魔附體,身如鬼魅。*防禦+32 身法+26
|
||||
f8(香袋)=填充木屑、香粉的小布包,*常用來裝飾兼避邪的物品。*靈力+8 吉運+9 避毒率+20%
|
||||
f9(護腕)=粗布縫製之腕部護套。*防禦+2
|
||||
fa(鐵護腕)=精鋼打造之腕部護環。*防禦+5
|
||||
fb(竹笛)=青竹削製之七孔橫笛。*吉運+18
|
||||
fc(珍珠)=蚌類所生的球狀物,*是珍貴的裝飾品。*吉運+20
|
||||
fd(玉鐲)=戴在手臂上的玉製環形首飾。*防禦+5 吉運+9
|
||||
fe(唸珠)=佛教徒記數唸經咒或佛號次數的*計算珠。*靈力+5 防禦+5
|
||||
ff(銀針)=用銀針刺肉,以痛楚喚醒神智,*可解妖縛、昏睡、瘋魔。HP-9
|
||||
100(銅鏡)=青銅鑄造的照容用具。*防禦+6
|
||||
101(八卦鏡)=用朱砂在鏡面畫八卦,*可借用自然界的靈氣。*靈力+8 防禦+8
|
||||
102(幹坤鏡)=銅鏡背面鑄有太極乾坤圖,*可吸取天地陰陽靈氣。*靈力+14 防禦+14
|
||||
103(豹牙手環)=收集花豹的利牙串成的手環。*防禦+9
|
||||
104(聖靈珠)=女媧末族祖傳寶物,曆代聖魂歸依*之所。合體法術: 武神*靈力+128 防禦+15 避毒率+35%
|
||||
105(金罡珠)=大羅金仙修煉千年的內丹。*防禦+90
|
||||
106(五毒珠)=成精蟾怪的內丹,*佩戴後百毒不侵。
|
||||
107(風靈珠)=女媧降伏風神後,禁制風神於內的*寶珠。合體法術: 風卷殘雲*避風率+50%
|
||||
108(雷靈珠)=女媧降伏雷神後,禁制雷神於內的*寶珠。合體法術: 狂雷*避雷率+50%
|
||||
109(水靈珠)=女媧降伏雪妖後,禁制雪妖於內的*寶珠。合體法術: 風雪冰天*避水率+50%
|
||||
10a(火靈珠)=女媧降伏火神後,禁制火神於內的*寶珠。合體法術: 煉獄真火*避火率+50%
|
||||
10b(土靈珠)=女媧降伏山神後,禁制山神於內的*寶珠。合體法術: 泰山壓頂*避土率+50% 可用於脫離洞窟
|
||||
10c(煉蠱皿)=可將毒蛇卵、毒蠍卵、毒蟾卵、*蜘蛛卵、蜈蚣卵煉成蠱。
|
||||
10d(壽葫蘆)=戰鬥中發出真氣補充持有者,*有提神振氣之奇效。*HPMP每回合+20
|
||||
10e(紫金葫蘆)=收妖煉丹,需與靈葫咒配合。
|
||||
10f(布包)=長安富商的行李。
|
||||
110(桂花酒)=摻了水的酒。
|
||||
111(紫金丹)=水月宮最珍貴的仙丹靈藥。
|
||||
112(玉佛珠)=西方如來檀前的唸珠,經佛法薰陶*變化通靈。合體法術: 佛法無邊*靈力+88 防禦+18 避毒率+30%
|
||||
113(金鳳凰蛋殼)=藥材。
|
||||
114(火眼麒麟角)=藥材。
|
||||
116(毒龍膽)=千年毒蛟的膽,以毒攻毒可解天下*所有的毒。*若沒中毒吃毒龍膽會斃命。
|
||||
117(破天錘)=用來敲碎仙靈島石像的法寶。
|
||||
118(包袱)=嬸嬸替逍遙收拾的行李。
|
||||
119(銀杏果)=藥材。
|
||||
11a(鯉魚)=藥材。
|
||||
11b(鹿茸)=藥材。
|
||||
11c(釣竿)=借來的,記得還!
|
||||
11d(捕獸夾)=獵戶放置的捕鹿的道具。
|
||||
11e(六神丹)=韓家藥鋪的祖傳婦女良藥。
|
||||
11f(情書)=士兵委托的情書。
|
||||
120(玉佩)=婢女委托的玉佩。
|
||||
121(石鑰匙)=開啟隱龍窟後洞石門的鑰匙。
|
||||
122(天書)=書中仙附身於書中。
|
||||
123(香蕉)=誰喜歡吃香蕉?
|
||||
124(鳳紋手絹)=某人交付的信物。
|
||||
125(手卷)=李逍遙的父母親所留下的武功*秘笈。
|
||||
126(蘆葦漂)=可載人漂浮水面的草席。
|
||||
127(夢蛇)=女媧族的變身魔法,*能力大幅提升。
|
||||
128(氣療術)=我方單人HP+75
|
||||
129(觀音咒)=我方單人HP+150
|
||||
12a(凝神歸元)=我方單人HP+220
|
||||
12b(元靈歸心術)=我方單人HP+500
|
||||
12c(五氣朝元)=我方全體HP+300
|
||||
12d(還魂咒)=我方單人復活*HP恢復10%
|
||||
12e(贖魂)=我方單人復活*HP恢復30%
|
||||
12f(回夢)=敵方單人昏睡四回合。
|
||||
130(奪魂)=吸取敵人魂魄,中者立斃。
|
||||
131(鬼降)=敵方單人瘋魔四回合。
|
||||
132(淨衣咒)=解赤毒、屍毒、瘴毒。
|
||||
133(冰心訣)=解妖縛、昏睡、瘋魔、咒封。
|
||||
134(靈血咒)=解赤毒、屍毒、瘴毒、毒絲、*麻痹、催眠、瘋魔、咒封。
|
||||
135(金剛咒)=使用後如有金鐘鐵罩護身,*增加防禦七回合。
|
||||
136(真元護體)=使用後如有鐵鎧金甲護體,*增加防禦九回合。
|
||||
137(天罡戰氣)=七回合內,使用武器攻擊,*威力提升。
|
||||
138(風咒)=風系初級法術,*攻擊敵方單人。
|
||||
139(旋風咒)=風系中級法術,*攻擊敵方全體。
|
||||
13a(風卷殘雲)=風系高級法術,*攻擊敵方全體。
|
||||
13b(風神)=召喚風神,*最強的風系法術。
|
||||
13c(雷咒)=雷系初級法術,*攻擊敵方單人。
|
||||
13d(五雷咒)=雷系中級法術,*攻擊敵方全體。
|
||||
13e(天雷破)=雷系高級法術,*攻擊敵方單人。
|
||||
13f(狂雷)=雷系高級法術,*攻擊敵方全體。
|
||||
140(雷神)=召喚雷神,*最強的雷系法術。
|
||||
141(冰咒)=冰系初級法術,*攻擊敵方單人。
|
||||
142(玄冰咒)=冰系中級法術,*攻擊敵方全體。
|
||||
143(風雪冰天)=冰系高級法術,*攻擊敵方全體。
|
||||
144(風雪冰天)=冰系高級法術,*攻擊敵方全體。
|
||||
145(雪妖)=召喚雪妖,*最強的冰系法術。
|
||||
147(炎咒)=火系初級法術,*攻擊敵方單人。
|
||||
148(三昧真火)=火系中級法術,*攻擊敵方全體。
|
||||
149(炎殺咒)=火系高級法術,*攻擊敵方單人。
|
||||
14a(煉獄真火)=火系高級法術,*攻擊敵方全體。
|
||||
14c(土咒)=土系初級法術,*攻擊敵方單人。
|
||||
14d(飛岩術)=土系中級法術,*攻擊敵方全體。
|
||||
14e(地裂天崩)=土系中級法術,*攻擊敵方全體。
|
||||
14f(泰山壓頂)=土系高級法術,*攻擊敵方全體。
|
||||
150(山神)=召喚山神,*最強的土系法術。
|
||||
151(氣劍指)=蘇州林家的家傳武藝,*攻擊敵方全體。
|
||||
154(一陽指)=聚勁食指,發出剛猛的氣芒,*攻擊敵方單人。
|
||||
155(七訣劍氣)=以指代劍,發出裂地劍氣*攻擊敵方全體。
|
||||
156(斬龍訣)=以雄渾氣勁橫掃群魔,*攻擊敵方全體。
|
||||
158(銅錢鏢)=將金錢當做暗器,攻擊敵方*單人,一次使用五百文錢。
|
||||
159(禦劍術)=蜀山派入門劍法,*攻擊敵方單人。
|
||||
15a(萬劍訣)=劍芒如雨直落,*攻擊敵方全體。
|
||||
15c(天劍)=人劍合一,身化利劍,*攻擊敵方全體。
|
||||
15d(天師符法)=茅山道士用來對付妖怪*的符法,攻擊敵方單人。
|
||||
15f(武神)=召喚武神,神刀斬魔。
|
||||
160(三屍咒)=下蠱攻擊敵方單人,*有蠱時才能使用。
|
||||
161(禦蜂術)=以笛音指揮毒蜂,*攻擊敵方全體。
|
||||
162(萬蟻蝕象)=操縱食人毒蟻,*攻擊敵方單人。
|
||||
16b(劍神)=召喚劍神,萬劍齊飛。
|
||||
172(酒神)=召喚酒神,*用全身真氣爆發攻擊敵人。
|
||||
174(萬蠱蝕天)=放蠱攻擊敵方全體,*有蠱時才能使用。
|
||||
176(爆炸蠱)=預先將法力灌輸在蠱蟲體*內,投擲敵人產生強烈爆炸。
|
||||
179(飛龍探雲手)=偷取敵人的物品或金錢。
|
||||
180(靈葫咒)=當妖物體力低於四分之一時,*可將其收入紫金葫蘆中煉藥。
|
||||
185(火神)=召喚火神,*最強的火系法術。
|
||||
186(醉仙望月步)=五回合內,使用武器攻擊,*可連續出手兩次。
|
||||
188(金蟬脫殼)=戰鬥中逃跑。
|
||||
189(仙風雲體術)=身法暫時提升九回合。
|
||||
18a(乾坤一擲)=使用金錢鏢攻擊敵方全體,*會耗損大量金錢。
|
||||
240
database.json
240
database.json
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"generated_at": "2026-04-01T22:48:55Z",
|
||||
"total_files": 7295,
|
||||
"total_size": 9190294264,
|
||||
"generated_at": "2026-04-02T12:45:07Z",
|
||||
"total_files": 7302,
|
||||
"total_size": 9190488848,
|
||||
"files": {
|
||||
"520d3d1b5897800af47f92efd2444a26b7a7dead": {
|
||||
"path": "bios/3DO Company/3DO/3do_arcade_saot.bin",
|
||||
@@ -30004,8 +30004,8 @@
|
||||
"adler32": "0cb8a7e3"
|
||||
},
|
||||
"686ebb5f39dd4fc907a0b748867d0a022d2f1a60": {
|
||||
"path": "bios/Dragon/Dragon/deltados.rom",
|
||||
"name": "deltados.rom",
|
||||
"path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"name": "delta2.rom",
|
||||
"size": 8192,
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"md5": "024eac3db20f1b5cf98c30a0e4743201",
|
||||
@@ -35053,6 +35053,16 @@
|
||||
"crc32": "a317e6b4",
|
||||
"adler32": "0e7344db"
|
||||
},
|
||||
"0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd": {
|
||||
"path": "bios/Microsoft/MSX/.variants/MSX2.ROM.0081ea0d",
|
||||
"name": "MSX2.ROM",
|
||||
"size": 32768,
|
||||
"sha1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||
"md5": "53bec1c22b30c0a15263e04b91a7814f",
|
||||
"sha256": "0c672d86ead61a97f49a583b88b7c1905da120645cd44f0c9f2baf4f4631e0b1",
|
||||
"crc32": "9b3e7b97",
|
||||
"adler32": "1ce46674"
|
||||
},
|
||||
"e90f80a61d94c617850c415e12ad70ac41e66bb7": {
|
||||
"path": "bios/Microsoft/MSX/.variants/MSX2P.ROM.e90f80a6",
|
||||
"name": "MSX2P.ROM",
|
||||
@@ -40443,6 +40453,26 @@
|
||||
"crc32": "0c0644ba",
|
||||
"adler32": "c7b3f901"
|
||||
},
|
||||
"73acccee601b56a2b7f624b0227fa7e1d662ef4b": {
|
||||
"path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"name": "sprites.sif",
|
||||
"size": 59482,
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"md5": "ebc011b876b9a4755fe44fa45d366996",
|
||||
"sha256": "e80d72041dc20ddffb3fa7e22e4c51acb06d95e81058d5eeb888b5bf308424ea",
|
||||
"crc32": "4e42c240",
|
||||
"adler32": "f7421b99"
|
||||
},
|
||||
"74c14b15dbc2f36c81d2ad9cb65e2893298415da": {
|
||||
"path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"name": "tilekey.dat",
|
||||
"size": 1028,
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"md5": "d74d5681ad8d825f5c229db1ee931bbb",
|
||||
"sha256": "e84df7374f8eff014458c6d8611c44f03b39b8d1a7abf30a2347dbb085b55232",
|
||||
"crc32": "57841d84",
|
||||
"adler32": "2a2a106e"
|
||||
},
|
||||
"2d539603665b8194c671ef5189c5a2b6db3ac645": {
|
||||
"path": "bios/Other/QEMU/bios-256k.bin",
|
||||
"name": "bios-256k.bin",
|
||||
@@ -69813,6 +69843,26 @@
|
||||
"crc32": "6a0e22a0",
|
||||
"adler32": "46021520"
|
||||
},
|
||||
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f": {
|
||||
"path": "bios/Sony/PlayStation/scph3500.bin",
|
||||
"name": "scph3500.bin",
|
||||
"size": 524288,
|
||||
"sha1": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
|
||||
"md5": "cba733ceeff5aef5c32254f1d617fa62",
|
||||
"sha256": "6f71ca1e716da761dc53187bd39e00c213f566e55090708fd3e2b4b425c8c989",
|
||||
"crc32": "bc190209",
|
||||
"adler32": "a8e56981"
|
||||
},
|
||||
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d": {
|
||||
"path": "bios/Sony/PlayStation/scph5000.bin",
|
||||
"name": "scph5000.bin",
|
||||
"size": 524288,
|
||||
"sha1": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
|
||||
"md5": "57a06303dfa9cf9351222dfcbb4a29d9",
|
||||
"sha256": "0c8359870cbac0ea091f1c87f188cd332dcc709753b91cafd9fd44a4a6188197",
|
||||
"crc32": "24fc7e17",
|
||||
"adler32": "1ac46cf1"
|
||||
},
|
||||
"e340db2696274dda5fdc25e434a914db71e8b02b": {
|
||||
"path": "bios/Sony/PlayStation/.variants/scph5000.bin.eb201d2d",
|
||||
"name": "scph5000.bin",
|
||||
@@ -70013,26 +70063,6 @@
|
||||
"crc32": "3539def6",
|
||||
"adler32": "9e7d4faa"
|
||||
},
|
||||
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f": {
|
||||
"path": "bios/Sony/PlayStation/scph3500.bin",
|
||||
"name": "scph3500.bin",
|
||||
"size": 524288,
|
||||
"sha1": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
|
||||
"md5": "cba733ceeff5aef5c32254f1d617fa62",
|
||||
"sha256": "6f71ca1e716da761dc53187bd39e00c213f566e55090708fd3e2b4b425c8c989",
|
||||
"crc32": "bc190209",
|
||||
"adler32": "a8e56981"
|
||||
},
|
||||
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d": {
|
||||
"path": "bios/Sony/PlayStation/scph5000.bin",
|
||||
"name": "scph5000.bin",
|
||||
"size": 524288,
|
||||
"sha1": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
|
||||
"md5": "57a06303dfa9cf9351222dfcbb4a29d9",
|
||||
"sha256": "0c8359870cbac0ea091f1c87f188cd332dcc709753b91cafd9fd44a4a6188197",
|
||||
"crc32": "24fc7e17",
|
||||
"adler32": "1ac46cf1"
|
||||
},
|
||||
"b05def971d8ec59f346f2d9ac21fb742e3eb6917": {
|
||||
"path": "bios/Sony/PlayStation/scph5500.bin",
|
||||
"name": "scph5500.bin",
|
||||
@@ -72543,6 +72573,16 @@
|
||||
"crc32": "b3ef7ac7",
|
||||
"adler32": "479a8ee1"
|
||||
},
|
||||
"56dd520570cdcdd60dda2eedc8af1e02a781dcc5": {
|
||||
"path": "bios/Texas Instruments/TI-99/Gram Kracker.ctg",
|
||||
"name": "Gram Kracker.ctg",
|
||||
"size": 7587,
|
||||
"sha1": "56dd520570cdcdd60dda2eedc8af1e02a781dcc5",
|
||||
"md5": "7551f1d578a32cccd97efd1adff15252",
|
||||
"sha256": "3e63f6a54a8001ddd75ecde70572c7030776d79817f46ee0dfcf5274dd03047f",
|
||||
"crc32": "f1c12fb2",
|
||||
"adler32": "16c3134e"
|
||||
},
|
||||
"4e764ab67dfcbee8adc5b7d98e7b2926a008b9d8": {
|
||||
"path": "bios/Texas Instruments/TI-99/TI-994A.ctg",
|
||||
"name": "TI-994A.ctg",
|
||||
@@ -72553,6 +72593,16 @@
|
||||
"crc32": "a092207d",
|
||||
"adler32": "ba312438"
|
||||
},
|
||||
"698c638e1773244a6bf8a353c87d210047cce402": {
|
||||
"path": "bios/Texas Instruments/TI-99/cf7+.ctg",
|
||||
"name": "cf7+.ctg",
|
||||
"size": 5768,
|
||||
"sha1": "698c638e1773244a6bf8a353c87d210047cce402",
|
||||
"md5": "d3fd9bc1fcaf48e5ed681c5ac31bc194",
|
||||
"sha256": "8998c8525a9014a7983a8ed3b03fa8210a08c205dacccd654f139f78f20623da",
|
||||
"crc32": "81f3aec2",
|
||||
"adler32": "23a55284"
|
||||
},
|
||||
"382292295c00dff348d7e17c5ce4da12a1d87763": {
|
||||
"path": "bios/Texas Instruments/TI-99/spchrom.bin",
|
||||
"name": "spchrom.bin",
|
||||
@@ -72573,6 +72623,16 @@
|
||||
"crc32": "1a52b40c",
|
||||
"adler32": "152e6876"
|
||||
},
|
||||
"c7bf5fcfea0502011dca76d12efcc242e23421b9": {
|
||||
"path": "bios/Texas Instruments/TI-99/ti-pcard.ctg",
|
||||
"name": "ti-pcard.ctg",
|
||||
"size": 71924,
|
||||
"sha1": "c7bf5fcfea0502011dca76d12efcc242e23421b9",
|
||||
"md5": "63f161f0d634e6092a1729b97efb00d1",
|
||||
"sha256": "06eae0519b66734b546d4a6508f8f20ab3f57d21819c469ff748e68816e27bce",
|
||||
"crc32": "62b3c3d0",
|
||||
"adler32": "4224aa4e"
|
||||
},
|
||||
"e05575b630bea7ff98b9ca1f083d745abb3110b6": {
|
||||
"path": "bios/Texas Instruments/TI-99/ti99_4a.zip",
|
||||
"name": "ti99_4a.zip",
|
||||
@@ -72952,6 +73012,16 @@
|
||||
"sha256": "7dc407fbccbf684dc677bed81120f45f0d3406ff7945eaf207a5c38b036c30e0",
|
||||
"crc32": "a42ef0fd",
|
||||
"adler32": "0d15827f"
|
||||
},
|
||||
"8c20ff26ebfefbf9b050b67af8083704003595ba": {
|
||||
"path": "bios/sdlpal/desc.dat",
|
||||
"name": "desc.dat",
|
||||
"size": 16027,
|
||||
"sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba",
|
||||
"md5": "084b6bc9804710a89a542335a3e4b1e0",
|
||||
"sha256": "0d6487d6832488130bc94b1ec5ee71766717b929c249693327089e461460ae40",
|
||||
"crc32": "5ea6b7fc",
|
||||
"adler32": "27df2df0"
|
||||
}
|
||||
},
|
||||
"indexes": {
|
||||
@@ -76461,6 +76531,7 @@
|
||||
"74b0f217fa0e2b8bb5a2f8e2ecc69da3": "bf5fb954db868e523febccc68549ed9187961076",
|
||||
"acf53887c2d2783dc059a9b442c86b90": "5aff2d9b6efc723bc395b0f96f0adfa83cc54a49",
|
||||
"364a1a579fe5cb8dba54519bcfcdac0d": "e998f0c441f4f1800ef44e42cd1659150206cf79",
|
||||
"53bec1c22b30c0a15263e04b91a7814f": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||
"847cc025ffae665487940ff2639540e5": "e90f80a61d94c617850c415e12ad70ac41e66bb7",
|
||||
"55cca200bbbdd0a1ec5c9d70966c05c0": "4e9384c9d137f0ab65ffc5a78f04cd8c9df6c8b7",
|
||||
"d6dedca1112ddfda94cc9b2e426b818b": "69dd7344e4dfa7e250973a71bbb3e8aa6fb08d81",
|
||||
@@ -77000,6 +77071,8 @@
|
||||
"82a22231d402cd3284c698ba16a51d1d": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc",
|
||||
"9a432244d9ee4a49e8ddcde64af94e05": "86fc8dc0932f983efa199e31ae05a4424772f959",
|
||||
"f20bb7bc1b97453161e63964f24a2785": "91d75a87872cbb88964bead92e0cbf8b72e836b6",
|
||||
"ebc011b876b9a4755fe44fa45d366996": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"d74d5681ad8d825f5c229db1ee931bbb": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"e8dcffae189b20fbe2722b857faa487c": "2d539603665b8194c671ef5189c5a2b6db3ac645",
|
||||
"8bef06d1aa74c9ff45b268a18efcc954": "cb1bd2cf5f89741900061955ac1a3b7cbd7a1ce9",
|
||||
"07ec9c82c2ac93d091f46236e93c8bbb": "359becb4c1dcd61c139ab3786983da9640677701",
|
||||
@@ -79937,6 +80010,8 @@
|
||||
"dc2b9bf8da62ec93e868cfd29f0d067d": "649895efd79d14790eabb362e94eb0622093dfb9",
|
||||
"e2110b8a2b97a8e0b857a45d32f7e187": "b6a11579caef3875504fcf3831b8e3922746df2c",
|
||||
"9a09ab7e49b422c007e6d54d7c49b965": "7771d6e90980408f753891648685def6dd42ef6d",
|
||||
"cba733ceeff5aef5c32254f1d617fa62": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
|
||||
"57a06303dfa9cf9351222dfcbb4a29d9": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
|
||||
"eb201d2d98251a598af467d4347bb62f": "e340db2696274dda5fdc25e434a914db71e8b02b",
|
||||
"2118230527a9f51bd9216e32fa912842": "1a8d6f9453111b1d317bb7dae300495fbf54600c",
|
||||
"ca5cfc321f916756e3f0effbfaeba13b": "73107d468fc7cb1d2c5b18b269715dd889ecef06",
|
||||
@@ -79957,8 +80032,6 @@
|
||||
"b10f5e0e3d9eb60e5159690680b1e774": "beb0ac693c0dc26daf5665b3314db81480fa5c7c",
|
||||
"de93caec13d1a141a40a79f5c86168d6": "dbc7339e5d85827c095764fc077b41f78fd2ecae",
|
||||
"849515939161e62f6b866f6853006780": "b06f4a861f74270be819aa2a07db8d0563a7cc4e",
|
||||
"cba733ceeff5aef5c32254f1d617fa62": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
|
||||
"57a06303dfa9cf9351222dfcbb4a29d9": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
|
||||
"8dd7d5296a650fac7319bce665a6a53c": "b05def971d8ec59f346f2d9ac21fb742e3eb6917",
|
||||
"490f666e1afb15b7362b406ed1cea246": "0555c6fae8906f3f09baf5988f00e55f88e9f30b",
|
||||
"32736f17079d0b2b7024407c39bd3050": "f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0",
|
||||
@@ -80210,9 +80283,12 @@
|
||||
"c6ff8204c5c81b7be34614dbbd690c8b": "8177bc6d5489d575cbfa9a004d097fc08c6f8c86",
|
||||
"6e30e823ddba73234480984ee50730c1": "630b9f529b954851fbdcfeb1d91a950d4bda0547",
|
||||
"42f768a66fa8b27dadb8361dd2e2e012": "8212fbd8899a2808c7ace4559245861e5bee2c9a",
|
||||
"7551f1d578a32cccd97efd1adff15252": "56dd520570cdcdd60dda2eedc8af1e02a781dcc5",
|
||||
"412ecbf991edcb68edd0e76c2caa4a59": "4e764ab67dfcbee8adc5b7d98e7b2926a008b9d8",
|
||||
"d3fd9bc1fcaf48e5ed681c5ac31bc194": "698c638e1773244a6bf8a353c87d210047cce402",
|
||||
"7adcaf64272248f7a7161cfc02fd5b3f": "382292295c00dff348d7e17c5ce4da12a1d87763",
|
||||
"04714f43347cefb2a051a77116344b3f": "693f5b4fe1e5eb6429fd6614fb7bb14350939814",
|
||||
"63f161f0d634e6092a1729b97efb00d1": "c7bf5fcfea0502011dca76d12efcc242e23421b9",
|
||||
"3df4d280ad76edc0662c2e89ad4f2f74": "e05575b630bea7ff98b9ca1f083d745abb3110b6",
|
||||
"01770fde15c34ff88bb49526d38cb1f6": "a11d1801594fa3d1f95d37bbcc2e0faa1ad013c6",
|
||||
"12ae505e36b850030f5188e960864775": "8d2865996a1a8d8a13fc9965c1bcf490f9621399",
|
||||
@@ -80250,7 +80326,8 @@
|
||||
"a9082f02d4f93c1f6c4e428e06b834e8": "d07114a9f3490338a265fb30d16b052c8da3bb7d",
|
||||
"8d4abc7dd31a64f2ddd811c19ae8c09e": "b3730071e789877bea3373ffa59ca673a4b1f4c9",
|
||||
"6e7e391c629332cc9d29902b98e52f94": "48024e2f5943ed86cb1b8e9443603991cdb05808",
|
||||
"bbd27768c16e6077b1a90dc0eb8558a3": "24a487f22f3da292e179b3edd6c30222a8ff933d"
|
||||
"bbd27768c16e6077b1a90dc0eb8558a3": "24a487f22f3da292e179b3edd6c30222a8ff933d",
|
||||
"084b6bc9804710a89a542335a3e4b1e0": "8c20ff26ebfefbf9b050b67af8083704003595ba"
|
||||
},
|
||||
"by_name": {
|
||||
"3do_arcade_saot.bin": [
|
||||
@@ -88771,7 +88848,7 @@
|
||||
"ddos42.rom": [
|
||||
"7747fe3d431b745b570629fe7f3f5d51b6d6f393"
|
||||
],
|
||||
"deltados.rom": [
|
||||
"delta2.rom": [
|
||||
"686ebb5f39dd4fc907a0b748867d0a022d2f1a60"
|
||||
],
|
||||
"dplus48.rom": [
|
||||
@@ -90267,6 +90344,10 @@
|
||||
"MSX_8020-20bios.rom": [
|
||||
"e998f0c441f4f1800ef44e42cd1659150206cf79"
|
||||
],
|
||||
"MSX2.ROM": [
|
||||
"0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||
"6103b39f1e38d1aa2d84b1c3219c44f1abb5436e"
|
||||
],
|
||||
"MSX2P.ROM": [
|
||||
"e90f80a61d94c617850c415e12ad70ac41e66bb7",
|
||||
"e2fbd56e42da637609d23ae9df9efd1b4241b18a"
|
||||
@@ -90344,9 +90425,6 @@
|
||||
"409e82adac40f6bdd18eb6c84e8b2fbdc7fb5498",
|
||||
"e998f0c441f4f1800ef44e42cd1659150206cf79"
|
||||
],
|
||||
"MSX2.ROM": [
|
||||
"6103b39f1e38d1aa2d84b1c3219c44f1abb5436e"
|
||||
],
|
||||
"MSX2EXT.ROM": [
|
||||
"5c1f9c7fb655e43d38e5dd1fcc6b942b2ff68b02"
|
||||
],
|
||||
@@ -91694,6 +91772,12 @@
|
||||
"Doukutsu.exe": [
|
||||
"91d75a87872cbb88964bead92e0cbf8b72e836b6"
|
||||
],
|
||||
"sprites.sif": [
|
||||
"73acccee601b56a2b7f624b0227fa7e1d662ef4b"
|
||||
],
|
||||
"tilekey.dat": [
|
||||
"74c14b15dbc2f36c81d2ad9cb65e2893298415da"
|
||||
],
|
||||
"bios-256k.bin": [
|
||||
"2d539603665b8194c671ef5189c5a2b6db3ac645"
|
||||
],
|
||||
@@ -99662,10 +99746,14 @@
|
||||
"scph101_v44.bin": [
|
||||
"7771d6e90980408f753891648685def6dd42ef6d"
|
||||
],
|
||||
"scph5000.bin": [
|
||||
"e340db2696274dda5fdc25e434a914db71e8b02b",
|
||||
"scph3500.bin": [
|
||||
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
|
||||
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d"
|
||||
],
|
||||
"scph5000.bin": [
|
||||
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
|
||||
"e340db2696274dda5fdc25e434a914db71e8b02b"
|
||||
],
|
||||
"PSX_DTLH2000.bin": [
|
||||
"1a8d6f9453111b1d317bb7dae300495fbf54600c"
|
||||
],
|
||||
@@ -99721,9 +99809,7 @@
|
||||
"dbc7339e5d85827c095764fc077b41f78fd2ecae"
|
||||
],
|
||||
"scph3000.bin": [
|
||||
"b06f4a861f74270be819aa2a07db8d0563a7cc4e"
|
||||
],
|
||||
"scph3500.bin": [
|
||||
"b06f4a861f74270be819aa2a07db8d0563a7cc4e",
|
||||
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f"
|
||||
],
|
||||
"scph5500.bin": [
|
||||
@@ -100454,15 +100540,24 @@
|
||||
"630b9f529b954851fbdcfeb1d91a950d4bda0547",
|
||||
"e05575b630bea7ff98b9ca1f083d745abb3110b6"
|
||||
],
|
||||
"Gram Kracker.ctg": [
|
||||
"56dd520570cdcdd60dda2eedc8af1e02a781dcc5"
|
||||
],
|
||||
"TI-994A.ctg": [
|
||||
"4e764ab67dfcbee8adc5b7d98e7b2926a008b9d8"
|
||||
],
|
||||
"cf7+.ctg": [
|
||||
"698c638e1773244a6bf8a353c87d210047cce402"
|
||||
],
|
||||
"spchrom.bin": [
|
||||
"382292295c00dff348d7e17c5ce4da12a1d87763"
|
||||
],
|
||||
"ti-disk.ctg": [
|
||||
"693f5b4fe1e5eb6429fd6614fb7bb14350939814"
|
||||
],
|
||||
"ti-pcard.ctg": [
|
||||
"c7bf5fcfea0502011dca76d12efcc242e23421b9"
|
||||
],
|
||||
"mo5-v1.1.rom": [
|
||||
"8d2865996a1a8d8a13fc9965c1bcf490f9621399"
|
||||
],
|
||||
@@ -100567,6 +100662,9 @@
|
||||
"Tortuga.dat": [
|
||||
"24a487f22f3da292e179b3edd6c30222a8ff933d"
|
||||
],
|
||||
"desc.dat": [
|
||||
"8c20ff26ebfefbf9b050b67af8083704003595ba"
|
||||
],
|
||||
"goldstar_fc1_enc.bin": [
|
||||
"8ef7503c948314d242da47b7fdc272f68dac2aee"
|
||||
],
|
||||
@@ -101699,6 +101797,12 @@
|
||||
"d64tano2.rom": [
|
||||
"e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e"
|
||||
],
|
||||
"deltados.rom": [
|
||||
"686ebb5f39dd4fc907a0b748867d0a022d2f1a60"
|
||||
],
|
||||
"Premier Micros - DeltaDOS": [
|
||||
"686ebb5f39dd4fc907a0b748867d0a022d2f1a60"
|
||||
],
|
||||
"exos20.rom": [
|
||||
"6033a0535136c40c47137e4d1cd9273c06d5fdff"
|
||||
],
|
||||
@@ -102655,6 +102759,12 @@
|
||||
"scph102C.bin": [
|
||||
"dbc7339e5d85827c095764fc077b41f78fd2ecae"
|
||||
],
|
||||
"sony-playstation:cba733ceeff5aef5c32254f1d617fa62": [
|
||||
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f"
|
||||
],
|
||||
"sony-playstation:57a06303dfa9cf9351222dfcbb4a29d9": [
|
||||
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d"
|
||||
],
|
||||
"scph5001.bin": [
|
||||
"ca7af30b50d9756cbd764640126c454cff658479"
|
||||
],
|
||||
@@ -103225,12 +103335,6 @@
|
||||
"sony-playstation:239665b1a3dade1b5a52c06338011044": [
|
||||
"343883a7b555646da8cee54aadd2795b6e7dd070"
|
||||
],
|
||||
"sony-playstation:cba733ceeff5aef5c32254f1d617fa62": [
|
||||
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f"
|
||||
],
|
||||
"sony-playstation:57a06303dfa9cf9351222dfcbb4a29d9": [
|
||||
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d"
|
||||
],
|
||||
"sony-playstation:81328b966e6dcf7ea1e32e55e1c104bb": [
|
||||
"15c94da3cc5a38a582429575af4198c487fe893c"
|
||||
],
|
||||
@@ -103384,6 +103488,9 @@
|
||||
"MOONSOUND.rom": [
|
||||
"32760893ce06dbe3930627755ba065cc3d8ec6ca"
|
||||
],
|
||||
"MSX2J.rom": [
|
||||
"0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd"
|
||||
],
|
||||
"MSX2P.rom": [
|
||||
"e90f80a61d94c617850c415e12ad70ac41e66bb7"
|
||||
],
|
||||
@@ -107708,6 +107815,7 @@
|
||||
"d42f4444": "bf5fb954db868e523febccc68549ed9187961076",
|
||||
"1f6406fb": "5aff2d9b6efc723bc395b0f96f0adfa83cc54a49",
|
||||
"a317e6b4": "e998f0c441f4f1800ef44e42cd1659150206cf79",
|
||||
"9b3e7b97": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||
"19771608": "e90f80a61d94c617850c415e12ad70ac41e66bb7",
|
||||
"3353dcc6": "4e9384c9d137f0ab65ffc5a78f04cd8c9df6c8b7",
|
||||
"82312751": "69dd7344e4dfa7e250973a71bbb3e8aa6fb08d81",
|
||||
@@ -108247,6 +108355,8 @@
|
||||
"29e86dbc": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc",
|
||||
"aa727c5d": "86fc8dc0932f983efa199e31ae05a4424772f959",
|
||||
"0c0644ba": "91d75a87872cbb88964bead92e0cbf8b72e836b6",
|
||||
"4e42c240": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"57841d84": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"7db5c908": "2d539603665b8194c671ef5189c5a2b6db3ac645",
|
||||
"e7e3ac4c": "cb1bd2cf5f89741900061955ac1a3b7cbd7a1ce9",
|
||||
"e3f1ee0a": "359becb4c1dcd61c139ab3786983da9640677701",
|
||||
@@ -111184,6 +111294,8 @@
|
||||
"55847d8c": "649895efd79d14790eabb362e94eb0622093dfb9",
|
||||
"1e26792f": "b6a11579caef3875504fcf3831b8e3922746df2c",
|
||||
"6a0e22a0": "7771d6e90980408f753891648685def6dd42ef6d",
|
||||
"bc190209": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
|
||||
"24fc7e17": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
|
||||
"8c93a399": "e340db2696274dda5fdc25e434a914db71e8b02b",
|
||||
"18d0f7d8": "1a8d6f9453111b1d317bb7dae300495fbf54600c",
|
||||
"decb22f5": "73107d468fc7cb1d2c5b18b269715dd889ecef06",
|
||||
@@ -111204,8 +111316,6 @@
|
||||
"0bad7ea9": "beb0ac693c0dc26daf5665b3314db81480fa5c7c",
|
||||
"76b880e5": "dbc7339e5d85827c095764fc077b41f78fd2ecae",
|
||||
"3539def6": "b06f4a861f74270be819aa2a07db8d0563a7cc4e",
|
||||
"bc190209": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
|
||||
"24fc7e17": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
|
||||
"ff3eeb8c": "b05def971d8ec59f346f2d9ac21fb742e3eb6917",
|
||||
"8d8cb7e4": "0555c6fae8906f3f09baf5988f00e55f88e9f30b",
|
||||
"d786f0b9": "f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0",
|
||||
@@ -111457,9 +111567,12 @@
|
||||
"200dd7d0": "8177bc6d5489d575cbfa9a004d097fc08c6f8c86",
|
||||
"ea0cc014": "630b9f529b954851fbdcfeb1d91a950d4bda0547",
|
||||
"b3ef7ac7": "8212fbd8899a2808c7ace4559245861e5bee2c9a",
|
||||
"f1c12fb2": "56dd520570cdcdd60dda2eedc8af1e02a781dcc5",
|
||||
"a092207d": "4e764ab67dfcbee8adc5b7d98e7b2926a008b9d8",
|
||||
"81f3aec2": "698c638e1773244a6bf8a353c87d210047cce402",
|
||||
"58b155f7": "382292295c00dff348d7e17c5ce4da12a1d87763",
|
||||
"1a52b40c": "693f5b4fe1e5eb6429fd6614fb7bb14350939814",
|
||||
"62b3c3d0": "c7bf5fcfea0502011dca76d12efcc242e23421b9",
|
||||
"f93bd9f7": "e05575b630bea7ff98b9ca1f083d745abb3110b6",
|
||||
"71879a28": "a11d1801594fa3d1f95d37bbcc2e0faa1ad013c6",
|
||||
"237c60bf": "8d2865996a1a8d8a13fc9965c1bcf490f9621399",
|
||||
@@ -111497,7 +111610,8 @@
|
||||
"4a39a474": "d07114a9f3490338a265fb30d16b052c8da3bb7d",
|
||||
"bf1e4b9b": "b3730071e789877bea3373ffa59ca673a4b1f4c9",
|
||||
"e6b9ebfb": "48024e2f5943ed86cb1b8e9443603991cdb05808",
|
||||
"a42ef0fd": "24a487f22f3da292e179b3edd6c30222a8ff933d"
|
||||
"a42ef0fd": "24a487f22f3da292e179b3edd6c30222a8ff933d",
|
||||
"5ea6b7fc": "8c20ff26ebfefbf9b050b67af8083704003595ba"
|
||||
},
|
||||
"by_sha256": {
|
||||
"72a88b5b47b76bd5604b30c102c948fa7e0ee90ccbc83aba496c45cf90b5a0e7": "520d3d1b5897800af47f92efd2444a26b7a7dead",
|
||||
@@ -115005,6 +115119,7 @@
|
||||
"0a09940701f40647a2715271b43c9ab0d82bd488871427ad627b7e0f462f5dda": "bf5fb954db868e523febccc68549ed9187961076",
|
||||
"d87ce758a7171870a2a3e7893e09cbba2bd68ee70b4d0f0e49dd2ecd60aafdd1": "5aff2d9b6efc723bc395b0f96f0adfa83cc54a49",
|
||||
"1c85dac5536fa3ba6f2cb70deba02ff680b34ac6cc787d2977258bd663a99555": "e998f0c441f4f1800ef44e42cd1659150206cf79",
|
||||
"0c672d86ead61a97f49a583b88b7c1905da120645cd44f0c9f2baf4f4631e0b1": "0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||
"ca45b50d49a8199a2b8f74300556367a776df1bb28bf8af24d33e65f0fe37a99": "e90f80a61d94c617850c415e12ad70ac41e66bb7",
|
||||
"696da03345b9fd27799b8fd92024050a201c020ef730e9006cb8f10bbbf68004": "4e9384c9d137f0ab65ffc5a78f04cd8c9df6c8b7",
|
||||
"2715b192a9a647c31da88b4e1d778279ff3b40b80f606891732a6023e3039c2d": "69dd7344e4dfa7e250973a71bbb3e8aa6fb08d81",
|
||||
@@ -115544,6 +115659,8 @@
|
||||
"3ca567f014a71ea24734559ee63df8184886f17debeef41c4bf4cd6313d70bd1": "d8ce5b1405b6428969493efeb6f3aa2027c41bdc",
|
||||
"0ed991887342fba9e4b71668ff4c14ed93c2b3a19b4874dd0282404a1c442094": "86fc8dc0932f983efa199e31ae05a4424772f959",
|
||||
"8a7a63b24bb21557fb597697bdf09248c1ab7e3298cacfa1166d764dd81e7fc3": "91d75a87872cbb88964bead92e0cbf8b72e836b6",
|
||||
"e80d72041dc20ddffb3fa7e22e4c51acb06d95e81058d5eeb888b5bf308424ea": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"e84df7374f8eff014458c6d8611c44f03b39b8d1a7abf30a2347dbb085b55232": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"ae6f6aa973aaccc143f57aa960fb035fd9de4daee4ad0cd713322f8c259e7650": "2d539603665b8194c671ef5189c5a2b6db3ac645",
|
||||
"3dfd946d0c03ab0e022f84f10c3eb5f1dd507761f73e7d8067511ba35a10f776": "cb1bd2cf5f89741900061955ac1a3b7cbd7a1ce9",
|
||||
"e8fc9e55790dbe3cb31f019a3deb57206ba6c54f5e581adb2ab2677a9d391472": "359becb4c1dcd61c139ab3786983da9640677701",
|
||||
@@ -118481,6 +118598,8 @@
|
||||
"42e4124be7623e2e28b1db0d8d426539646faee49d74b71166d8ba5bd7c472ed": "649895efd79d14790eabb362e94eb0622093dfb9",
|
||||
"3d06d2c469313c2a2128d24fe2e0c71ff99bc2032be89a829a62337187f500b7": "b6a11579caef3875504fcf3831b8e3922746df2c",
|
||||
"8434528690df0d444dfe4e931eb5501be53df70497e63f4c9a21184631cdbb87": "7771d6e90980408f753891648685def6dd42ef6d",
|
||||
"6f71ca1e716da761dc53187bd39e00c213f566e55090708fd3e2b4b425c8c989": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
|
||||
"0c8359870cbac0ea091f1c87f188cd332dcc709753b91cafd9fd44a4a6188197": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
|
||||
"8e0383171e67b33e60d5df6394c58843f3b11c7a0b97f3bfcc4319ac2d1f9d18": "e340db2696274dda5fdc25e434a914db71e8b02b",
|
||||
"7f38da2e456540d267060175a7a1e3b4c39292d964051abd8b322c05367af04f": "1a8d6f9453111b1d317bb7dae300495fbf54600c",
|
||||
"4018749b3698b8694387beebcbabfb48470513066840f9441459ee4c9f0f39bc": "73107d468fc7cb1d2c5b18b269715dd889ecef06",
|
||||
@@ -118501,8 +118620,6 @@
|
||||
"5c0166da24e27deaa82246de8ff0108267fe4bb59f6df0fdec50e05e62448ca4": "beb0ac693c0dc26daf5665b3314db81480fa5c7c",
|
||||
"42244b0c650821519751b7e77ad1d3222a0125e75586df2b4e84ba693b9809dc": "dbc7339e5d85827c095764fc077b41f78fd2ecae",
|
||||
"5eb3aee495937558312b83b54323d76a4a015190decd4051214f1b6df06ac34b": "b06f4a861f74270be819aa2a07db8d0563a7cc4e",
|
||||
"6f71ca1e716da761dc53187bd39e00c213f566e55090708fd3e2b4b425c8c989": "e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
|
||||
"0c8359870cbac0ea091f1c87f188cd332dcc709753b91cafd9fd44a4a6188197": "ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
|
||||
"9c0421858e217805f4abe18698afea8d5aa36ff0727eb8484944e00eb5e7eadb": "b05def971d8ec59f346f2d9ac21fb742e3eb6917",
|
||||
"11052b6499e466bbf0a709b1f9cb6834a9418e66680387912451e971cf8a1fef": "0555c6fae8906f3f09baf5988f00e55f88e9f30b",
|
||||
"1faaa18fa820a0225e488d9f086296b8e6c46df739666093987ff7d8fd352c09": "f6bc2d1f5eb6593de7d089c425ac681d6fffd3f0",
|
||||
@@ -118754,9 +118871,12 @@
|
||||
"55c318616fad4fc32335c59f97fbca21f0a02424bece13b088cc11e0af73d993": "8177bc6d5489d575cbfa9a004d097fc08c6f8c86",
|
||||
"5b4dc460e53715e422e9dd86e4f7e7f323cc5320d35213dcd56b960fb8876003": "630b9f529b954851fbdcfeb1d91a950d4bda0547",
|
||||
"172db86fc7f03808084fcf846ae1e53143d2d26ec6a72f437b9726c6b4295359": "8212fbd8899a2808c7ace4559245861e5bee2c9a",
|
||||
"3e63f6a54a8001ddd75ecde70572c7030776d79817f46ee0dfcf5274dd03047f": "56dd520570cdcdd60dda2eedc8af1e02a781dcc5",
|
||||
"5a1787ece8a37db887d60953471084e2ea44a6dbe529d20882f4824d97536fa4": "4e764ab67dfcbee8adc5b7d98e7b2926a008b9d8",
|
||||
"8998c8525a9014a7983a8ed3b03fa8210a08c205dacccd654f139f78f20623da": "698c638e1773244a6bf8a353c87d210047cce402",
|
||||
"1a7481f3e7e2d464772b540f9b9e4d529dc61df372f181adf7432f0df9876c16": "382292295c00dff348d7e17c5ce4da12a1d87763",
|
||||
"c0a5c744fffa9265fd3ee49020d0697717eaf5aa2fefacd0387ad997b1165b5a": "693f5b4fe1e5eb6429fd6614fb7bb14350939814",
|
||||
"06eae0519b66734b546d4a6508f8f20ab3f57d21819c469ff748e68816e27bce": "c7bf5fcfea0502011dca76d12efcc242e23421b9",
|
||||
"d7bb2d9b65a766dcc03376c6afd9a605df5fe302cf61584f801653b7be87279a": "e05575b630bea7ff98b9ca1f083d745abb3110b6",
|
||||
"a8bf18e99904f9c14969a3be1da84da2438ee3d206928ead28eaff758e4449dd": "a11d1801594fa3d1f95d37bbcc2e0faa1ad013c6",
|
||||
"c15d3d6732399a879bb6de5ae2fcb9aadfd64da86d95652ced9ad96a2ae8e692": "8d2865996a1a8d8a13fc9965c1bcf490f9621399",
|
||||
@@ -118794,7 +118914,8 @@
|
||||
"c5e08982bc797752118eff67950f42d9c6ef6b9668d03f152c88b8ef8ed6a63b": "d07114a9f3490338a265fb30d16b052c8da3bb7d",
|
||||
"c06a6ae0804b20ded47b9ab9101ffe3a6438382b9ec664a2ec0fcd010f8566f4": "b3730071e789877bea3373ffa59ca673a4b1f4c9",
|
||||
"37ed55d89afe24a013de30feecf21fb0d75c58f3f0ff9a8449098eaaabe75aac": "48024e2f5943ed86cb1b8e9443603991cdb05808",
|
||||
"7dc407fbccbf684dc677bed81120f45f0d3406ff7945eaf207a5c38b036c30e0": "24a487f22f3da292e179b3edd6c30222a8ff933d"
|
||||
"7dc407fbccbf684dc677bed81120f45f0d3406ff7945eaf207a5c38b036c30e0": "24a487f22f3da292e179b3edd6c30222a8ff933d",
|
||||
"0d6487d6832488130bc94b1ec5ee71766717b929c249693327089e461460ae40": "8c20ff26ebfefbf9b050b67af8083704003595ba"
|
||||
},
|
||||
"by_path_suffix": {
|
||||
".variants/aa310.zip": [
|
||||
@@ -123327,6 +123448,9 @@
|
||||
"openmsx/fs-a1wsx_kanjifont.rom": [
|
||||
"5aff2d9b6efc723bc395b0f96f0adfa83cc54a49"
|
||||
],
|
||||
".variants/MSX2.ROM.0081ea0d": [
|
||||
"0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd"
|
||||
],
|
||||
".variants/MSX2P.ROM.e90f80a6": [
|
||||
"e90f80a61d94c617850c415e12ad70ac41e66bb7"
|
||||
],
|
||||
@@ -124275,6 +124399,12 @@
|
||||
"Oric/colour.rom": [
|
||||
"bda81f64be319d8793d284bf9d40f01d19b33515"
|
||||
],
|
||||
"nxengine/data/sprites.sif": [
|
||||
"73acccee601b56a2b7f624b0227fa7e1d662ef4b"
|
||||
],
|
||||
"nxengine/tilekey.dat": [
|
||||
"74c14b15dbc2f36c81d2ad9cb65e2893298415da"
|
||||
],
|
||||
"nvr/adgold.bin": [
|
||||
"e3b28842515140c82e2e897a53ad39333ed9512c"
|
||||
],
|
||||
@@ -132560,6 +132690,7 @@
|
||||
"d3b78c3dbac55f5199f33f3fe0036439811f7fb3",
|
||||
"1983b4fb398e3dd9668d424c666c5a0b3f1e2b69",
|
||||
"e3c8986bb1d44269c4587b04f1ca27a70b0aaa2e",
|
||||
"686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"6033a0535136c40c47137e4d1cd9273c06d5fdff",
|
||||
"81193965a374d77b99b4743d317824b53c3e3c78",
|
||||
"8f70d1b74483ba3a37e86cf16c849d601a8c3d2c",
|
||||
@@ -132639,6 +132770,8 @@
|
||||
"dcffe16bd90a723499ad46c641424981338d8378",
|
||||
"beb0ac693c0dc26daf5665b3314db81480fa5c7c",
|
||||
"dbc7339e5d85827c095764fc077b41f78fd2ecae",
|
||||
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
|
||||
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
|
||||
"ca7af30b50d9756cbd764640126c454cff658479",
|
||||
"1b0dbdb23da9dc0776aac58d0755dc80fea20975",
|
||||
"339a48f4fcf63e10b5b867b8c93cfd40945faf6c",
|
||||
@@ -132733,8 +132866,6 @@
|
||||
"03bbb386cf530e804363acdfc1d13e64cf28af2e",
|
||||
"55315b20fecb4441a07ee4bc5dc7153f396e0a2e",
|
||||
"343883a7b555646da8cee54aadd2795b6e7dd070",
|
||||
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f",
|
||||
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d",
|
||||
"15c94da3cc5a38a582429575af4198c487fe893c",
|
||||
"73107d468fc7cb1d2c5b18b269715dd889ecef06",
|
||||
"b05def971d8ec59f346f2d9ac21fb742e3eb6917",
|
||||
@@ -132766,6 +132897,7 @@
|
||||
"7ed7c55e0359737ac5e68d38cb6903f9e5d7c2b6",
|
||||
"9d789166e3caf28e4742fe933d962e99618c633d",
|
||||
"32760893ce06dbe3930627755ba065cc3d8ec6ca",
|
||||
"0081ea0d25bc5cd8d70b60ad8cfdc7307812c0fd",
|
||||
"e90f80a61d94c617850c415e12ad70ac41e66bb7",
|
||||
"df48902f5f12af8867ae1a87f255145f0e5e0774",
|
||||
"04990aa1c3a3fc7294ec884b81deaa89832df614",
|
||||
@@ -135341,6 +135473,12 @@
|
||||
".variants/scph101.bin.9a09ab7e": [
|
||||
"7771d6e90980408f753891648685def6dd42ef6d"
|
||||
],
|
||||
".variants/scph3000.bin.e38466a4": [
|
||||
"e38466a4ba8005fba7e9e3c7b9efeba7205bee3f"
|
||||
],
|
||||
".variants/scph3500.bin.ffa7f9a7": [
|
||||
"ffa7f9a7fb19d773a0c3985a541c8e5623d2c30d"
|
||||
],
|
||||
"Oric/microdisc.rom": [
|
||||
"0d2ef6e67322f48f4b7e08d8bbe68827e2074561"
|
||||
],
|
||||
|
||||
@@ -238,6 +238,7 @@ files:
|
||||
- name: CARTS.CRC
|
||||
required: false
|
||||
bundled: false
|
||||
unsourceable: "dead legacy code path, never created or distributed, replaced by CARTS.SHA"
|
||||
note: "CRC database for cartridge identification and mapper detection. Tried first, before CARTS.SHA (fMSX/MSX.c:2697)."
|
||||
|
||||
- name: CARTS.SHA
|
||||
|
||||
@@ -186,6 +186,7 @@ files:
|
||||
path: "np2kai/gpib.rom"
|
||||
size: 8192
|
||||
required: false
|
||||
unsourceable: "never publicly dumped, GP-IB emulation is stub code (source comment: not implemented)"
|
||||
note: >
|
||||
GP-IB interface BIOS ROM (8 KB). If missing, GP-IB emulation
|
||||
is disabled entirely.
|
||||
@@ -198,6 +199,8 @@ files:
|
||||
- name: "key.txt"
|
||||
path: "np2kai/key.txt"
|
||||
required: false
|
||||
hle_fallback: true
|
||||
unsourceable: "user-created keyboard config, no default distributed in any NP2kai release"
|
||||
note: >
|
||||
Keyboard remapping configuration (text file). User-created file
|
||||
for custom keyboard layout. The core uses built-in defaults if absent.
|
||||
|
||||
@@ -81,5 +81,6 @@ files:
|
||||
system: cave-story
|
||||
description: "Tile attribute lookup table (maps tile codes to collision/behavior attributes)"
|
||||
required: false
|
||||
hle_fallback: true
|
||||
source_ref: "map.cpp:290-303 (loaded at init, hardcoded default if missing)"
|
||||
note: "Not part of the freeware distribution. Generated by the standalone NXEngine extraction tool. The libretro core has hardcoded defaults in map.cpp:30."
|
||||
|
||||
@@ -247,6 +247,7 @@ files:
|
||||
- name: "WHDLoad.key"
|
||||
system: commodore-amiga
|
||||
required: false
|
||||
unsourceable: "per-user signed registration key, never distributed generically, WHDLoad free since v18.2"
|
||||
note: "WHDLoad license key. Copied to saves/WHDLoad/L/ for registered WHDLoad use."
|
||||
source_ref: "libretro/libretro-core.c:5985-5998"
|
||||
|
||||
|
||||
@@ -251,6 +251,7 @@ files:
|
||||
- name: "WHDLoad.key"
|
||||
system: commodore-amiga
|
||||
required: false
|
||||
unsourceable: "per-user signed registration key, never distributed generically, WHDLoad free since v18.2"
|
||||
note: "WHDLoad license key. Copied to saves/WHDLoad/L/ for registered WHDLoad use."
|
||||
source_ref: "libretro/libretro-core.c:5903-5916"
|
||||
|
||||
|
||||
@@ -70,11 +70,12 @@ files:
|
||||
aliases: []
|
||||
|
||||
- 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"
|
||||
required: false
|
||||
md5: "81bbe60ba7a3d1cea1d48c14cbcc647b"
|
||||
size: 4089584
|
||||
size: [524288, 4194304, 4089584]
|
||||
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: []
|
||||
|
||||
@@ -397,5 +397,6 @@ files:
|
||||
system: dragon64
|
||||
description: "Ikon Ultra Drive Dragonfly ROM 2.3"
|
||||
required: false
|
||||
unsourceable: "not yet dumped, only v1.3 publicly available, XRoar support is experimental (#ifdef WANT_EXPERIMENTAL)"
|
||||
source_ref: "xroar.c:715 (romlist ikon), ikon.c:151 (default @ikon)"
|
||||
note: "Experimental. Ikon Ultra Drive storage interface. Older version: dragonfly-1.3."
|
||||
|
||||
@@ -138,6 +138,8 @@ files:
|
||||
|
||||
- name: Custom.dat
|
||||
path: zc210/sfx/Custom.dat
|
||||
category: game_data
|
||||
description: user-provided custom SFX replacement
|
||||
required: false
|
||||
unsourceable: "user placeholder slot, README says 'rename your own SFX dat file to this name'"
|
||||
source_ref: "zelda.cpp:1193-1218, libretro.cpp:148"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "batocera",
|
||||
"display_name": "Batocera",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-01T14:41:41Z",
|
||||
"generated": "2026-04-02T13:52:15Z",
|
||||
"base_destination": "bios",
|
||||
"detect": [
|
||||
{
|
||||
@@ -15,8 +15,8 @@
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 1540,
|
||||
"total_size": 3891615271,
|
||||
"total_files": 1547,
|
||||
"total_size": 4371484317,
|
||||
"files": [
|
||||
{
|
||||
"dest": "panafz1.bin",
|
||||
@@ -2904,6 +2904,15 @@
|
||||
"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",
|
||||
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
||||
@@ -6148,6 +6157,39 @@
|
||||
"FinalBurn Neo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "gamegenie.nes",
|
||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||
@@ -8389,6 +8431,24 @@
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/data/sprites.sif",
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"size": 59482,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/tilekey.dat",
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"size": 1028,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "NMS8245SystemROM1.08.bin",
|
||||
"sha1": "cc57c1dcd7249ea9f8e2547244592e7d97308ed0",
|
||||
@@ -10657,6 +10717,15 @@
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "delta2.rom",
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"size": 8192,
|
||||
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"cores": [
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "cp450dsk.rom",
|
||||
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "bizhawk",
|
||||
"display_name": "BizHawk",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-01T14:00:10Z",
|
||||
"generated": "2026-04-02T13:52:21Z",
|
||||
"base_destination": "Firmware",
|
||||
"detect": [
|
||||
{
|
||||
@@ -19,8 +19,8 @@
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 527,
|
||||
"total_size": 2068127713,
|
||||
"total_files": 530,
|
||||
"total_size": 2547895289,
|
||||
"files": [
|
||||
{
|
||||
"dest": "panafz1.bin",
|
||||
@@ -1274,6 +1274,39 @@
|
||||
"FinalBurn Neo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "sl31253.bin",
|
||||
"sha1": "81193965a374d77b99b4743d317824b53c3e3c78",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "lakka",
|
||||
"display_name": "Lakka",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-01T14:42:08Z",
|
||||
"generated": "2026-04-02T13:52:45Z",
|
||||
"base_destination": "system",
|
||||
"detect": [
|
||||
{
|
||||
@@ -15,8 +15,8 @@
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 1620,
|
||||
"total_size": 5255358024,
|
||||
"total_files": 1627,
|
||||
"total_size": 5735234905,
|
||||
"files": [
|
||||
{
|
||||
"dest": "3do_arcade_saot.bin",
|
||||
@@ -3438,6 +3438,15 @@
|
||||
"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",
|
||||
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
||||
@@ -5070,6 +5079,39 @@
|
||||
"storage": "release",
|
||||
"release_asset": "vimana.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "nes.pal",
|
||||
"sha1": "37027d92e1015b82a7dc5c43e9f1649a961577ab",
|
||||
@@ -7862,6 +7904,24 @@
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/data/sprites.sif",
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"size": 59482,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/tilekey.dat",
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"size": 1028,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "mda.rom",
|
||||
"sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f",
|
||||
@@ -9650,6 +9710,15 @@
|
||||
"SameBoy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "sdlpal/desc.dat",
|
||||
"sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba",
|
||||
"size": 16027,
|
||||
"repo_path": "bios/sdlpal/desc.dat",
|
||||
"cores": [
|
||||
"SDLPAL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "SkyEmu/dmg_rom.bin",
|
||||
"sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "recalbox",
|
||||
"display_name": "Recalbox",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-01T14:42:39Z",
|
||||
"generated": "2026-04-02T13:53:15Z",
|
||||
"base_destination": "bios",
|
||||
"detect": [
|
||||
{
|
||||
@@ -15,8 +15,8 @@
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 1097,
|
||||
"total_size": 3500142330,
|
||||
"total_files": 1107,
|
||||
"total_size": 3980096655,
|
||||
"files": [
|
||||
{
|
||||
"dest": "3do/panafz1.bin",
|
||||
@@ -540,7 +540,7 @@
|
||||
"dest": "dragon/deltados.rom",
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"size": 8192,
|
||||
"repo_path": "bios/Dragon/Dragon/deltados.rom",
|
||||
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"cores": null
|
||||
},
|
||||
{
|
||||
@@ -851,6 +851,13 @@
|
||||
"repo_path": "bios/Microsoft/MSX/MSX2EXT.ROM",
|
||||
"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",
|
||||
"sha1": "e90f80a61d94c617850c415e12ad70ac41e66bb7",
|
||||
@@ -3797,6 +3804,39 @@
|
||||
"FinalBurn Neo"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "gamegenie.nes",
|
||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||
@@ -6452,6 +6492,24 @@
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/data/sprites.sif",
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"size": 59482,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/tilekey.dat",
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"size": 1028,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "64DD_IPL.bin",
|
||||
"sha1": "bf861922dcb78c316360e3e742f4f70ff63c9bc3",
|
||||
@@ -6821,6 +6879,33 @@
|
||||
"Stella 2023"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "Gram Kracker.ctg",
|
||||
"sha1": "56dd520570cdcdd60dda2eedc8af1e02a781dcc5",
|
||||
"size": 7587,
|
||||
"repo_path": "bios/Texas Instruments/TI-99/Gram Kracker.ctg",
|
||||
"cores": [
|
||||
"ti99sim"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "ti-pcard.ctg",
|
||||
"sha1": "c7bf5fcfea0502011dca76d12efcc242e23421b9",
|
||||
"size": 71924,
|
||||
"repo_path": "bios/Texas Instruments/TI-99/ti-pcard.ctg",
|
||||
"cores": [
|
||||
"ti99sim"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "cf7+.ctg",
|
||||
"sha1": "698c638e1773244a6bf8a353c87d210047cce402",
|
||||
"size": 5768,
|
||||
"repo_path": "bios/Texas Instruments/TI-99/cf7+.ctg",
|
||||
"cores": [
|
||||
"ti99sim"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "JiffyDOS_SX-64.bin",
|
||||
"sha1": "942c2150123dc30f40b3df6086132ef0a3c43948",
|
||||
@@ -7046,6 +7131,15 @@
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "delta2.rom",
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"size": 8192,
|
||||
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"cores": [
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "cp450dsk.rom",
|
||||
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "retroarch",
|
||||
"display_name": "RetroArch",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-01T14:42:08Z",
|
||||
"generated": "2026-04-02T13:52:45Z",
|
||||
"base_destination": "system",
|
||||
"detect": [
|
||||
{
|
||||
@@ -33,8 +33,8 @@
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 1620,
|
||||
"total_size": 5255358024,
|
||||
"total_files": 1627,
|
||||
"total_size": 5735234905,
|
||||
"files": [
|
||||
{
|
||||
"dest": "3do_arcade_saot.bin",
|
||||
@@ -3456,6 +3456,15 @@
|
||||
"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",
|
||||
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
||||
@@ -5088,6 +5097,39 @@
|
||||
"storage": "release",
|
||||
"release_asset": "vimana.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "nes.pal",
|
||||
"sha1": "37027d92e1015b82a7dc5c43e9f1649a961577ab",
|
||||
@@ -7880,6 +7922,24 @@
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/data/sprites.sif",
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"size": 59482,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/tilekey.dat",
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"size": 1028,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "mda.rom",
|
||||
"sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f",
|
||||
@@ -9668,6 +9728,15 @@
|
||||
"SameBoy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "sdlpal/desc.dat",
|
||||
"sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba",
|
||||
"size": 16027,
|
||||
"repo_path": "bios/sdlpal/desc.dat",
|
||||
"cores": [
|
||||
"SDLPAL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "SkyEmu/dmg_rom.bin",
|
||||
"sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "retrobat",
|
||||
"display_name": "RetroBat",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-01T14:42:50Z",
|
||||
"generated": "2026-04-02T13:53:25Z",
|
||||
"base_destination": "bios",
|
||||
"detect": [
|
||||
{
|
||||
@@ -14,8 +14,8 @@
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 1162,
|
||||
"total_size": 4297772175,
|
||||
"total_files": 1169,
|
||||
"total_size": 4777641221,
|
||||
"files": [
|
||||
{
|
||||
"dest": "panafz1.bin",
|
||||
@@ -2525,6 +2525,15 @@
|
||||
"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",
|
||||
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
||||
@@ -3968,6 +3977,39 @@
|
||||
"storage": "release",
|
||||
"release_asset": "vimana.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "gamegenie.nes",
|
||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||
@@ -6191,6 +6233,24 @@
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/data/sprites.sif",
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"size": 59482,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/tilekey.dat",
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"size": 1028,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "panafz1j.bin",
|
||||
"sha1": "ec7ec62d60ec0459a14ed56ebc66761ef3c80efc",
|
||||
@@ -7439,6 +7499,15 @@
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "delta2.rom",
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"size": 8192,
|
||||
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"cores": [
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "cp450dsk.rom",
|
||||
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "retrodeck",
|
||||
"display_name": "RetroDECK",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-01T14:43:08Z",
|
||||
"generated": "2026-04-02T13:53:43Z",
|
||||
"base_destination": "",
|
||||
"detect": [
|
||||
{
|
||||
@@ -15,8 +15,8 @@
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 3144,
|
||||
"total_size": 5871582893,
|
||||
"total_files": 3153,
|
||||
"total_size": 6351500734,
|
||||
"files": [
|
||||
{
|
||||
"dest": "bios/panafz1.bin",
|
||||
@@ -11082,7 +11082,7 @@
|
||||
"dest": "bios/deltados.rom",
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"size": 8192,
|
||||
"repo_path": "bios/Dragon/Dragon/deltados.rom",
|
||||
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"cores": null
|
||||
},
|
||||
{
|
||||
@@ -11477,6 +11477,13 @@
|
||||
"repo_path": "bios/Microsoft/MSX/openmsx/yrw801.rom",
|
||||
"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",
|
||||
"sha1": "04990aa1c3a3fc7294ec884b81deaa89832df614",
|
||||
@@ -16290,6 +16297,39 @@
|
||||
"storage": "release",
|
||||
"release_asset": "vimana.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "gamegenie.nes",
|
||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||
@@ -18256,6 +18296,24 @@
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/data/sprites.sif",
|
||||
"sha1": "73acccee601b56a2b7f624b0227fa7e1d662ef4b",
|
||||
"size": 59482,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/data/sprites.sif",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "nxengine/tilekey.dat",
|
||||
"sha1": "74c14b15dbc2f36c81d2ad9cb65e2893298415da",
|
||||
"size": 1028,
|
||||
"repo_path": "bios/Other/NXEngine/nxengine/tilekey.dat",
|
||||
"cores": [
|
||||
"NXEngine"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "mda.rom",
|
||||
"sha1": "c2a8b10808bf51a3c123ba3eb1e9dd608231916f",
|
||||
@@ -20037,6 +20095,15 @@
|
||||
"SameBoy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "sdlpal/desc.dat",
|
||||
"sha1": "8c20ff26ebfefbf9b050b67af8083704003595ba",
|
||||
"size": 16027,
|
||||
"repo_path": "bios/sdlpal/desc.dat",
|
||||
"cores": [
|
||||
"SDLPAL"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "SkyEmu/dmg_rom.bin",
|
||||
"sha1": "4ed31ec6b0b175bb109c0eb5fd3d193da823339f",
|
||||
@@ -21733,6 +21800,15 @@
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "delta2.rom",
|
||||
"sha1": "686ebb5f39dd4fc907a0b748867d0a022d2f1a60",
|
||||
"size": 8192,
|
||||
"repo_path": "bios/Dragon/Dragon/delta2.rom",
|
||||
"cores": [
|
||||
"XRoar"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "cp450dsk.rom",
|
||||
"sha1": "827697fa5b755f5dc1efb054cdbbeb04e405405b",
|
||||
@@ -22300,6 +22376,15 @@
|
||||
"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",
|
||||
"sha1": "ebb7eb540a390509edfd36c84288ba85e63f2d1f",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"platform": "romm",
|
||||
"display_name": "RomM",
|
||||
"version": "1.0",
|
||||
"generated": "2026-04-01T14:43:09Z",
|
||||
"generated": "2026-04-02T13:53:45Z",
|
||||
"base_destination": "bios",
|
||||
"detect": [
|
||||
{
|
||||
@@ -14,8 +14,8 @@
|
||||
}
|
||||
],
|
||||
"standalone_copies": [],
|
||||
"total_files": 535,
|
||||
"total_size": 1076531155,
|
||||
"total_files": 538,
|
||||
"total_size": 1556298731,
|
||||
"files": [
|
||||
{
|
||||
"dest": "3do/3do_arcade_saot.bin",
|
||||
@@ -2796,6 +2796,39 @@
|
||||
"ep128emu-core"
|
||||
]
|
||||
},
|
||||
{
|
||||
"dest": "colecovision/fbneo/samples/donpachi.zip",
|
||||
"sha1": "d380fb29287eb7fc9ff901a7653ad40785f7deb1",
|
||||
"size": 208549253,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "donpachi.zip"
|
||||
},
|
||||
{
|
||||
"dest": "colecovision/fbneo/samples/sfz3mix.zip",
|
||||
"sha1": "937cdc6ccf9de418b94d8b762aad36822f857ec9",
|
||||
"size": 116329446,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "sfz3mix.zip"
|
||||
},
|
||||
{
|
||||
"dest": "colecovision/fbneo/samples/twotiger.zip",
|
||||
"sha1": "74399cc36d97e9f74b387b87900505ebbf260ca9",
|
||||
"size": 154888877,
|
||||
"repo_path": "",
|
||||
"cores": [
|
||||
"FinalBurn Neo"
|
||||
],
|
||||
"storage": "release",
|
||||
"release_asset": "twotiger.zip"
|
||||
},
|
||||
{
|
||||
"dest": "fds/gamegenie.nes",
|
||||
"sha1": "f430a0d752a9fa0c7032db8131f9090d18f71779",
|
||||
|
||||
@@ -138,6 +138,7 @@ nav:
|
||||
- VTech: systems/vtech.md
|
||||
- Vircon: systems/vircon.md
|
||||
- ZC: systems/zc.md
|
||||
- sdlpal: systems/sdlpal.md
|
||||
- Emulators:
|
||||
- Overview: emulators/index.md
|
||||
- Official ports (63):
|
||||
|
||||
@@ -150,22 +150,23 @@ data_directories:
|
||||
description: "SDLPAL Chinese Paladin game data (.mkf archives)"
|
||||
|
||||
# ref: OpenTyrian2000 — system/opentyrian/tyrian/
|
||||
# Tyrian 2.1 freeware data (also on buildbot as OpenTyrian.zip)
|
||||
# Tyrian 2.1 freeware data (buildbot URLs removed, sourced from release asset)
|
||||
opentyrian:
|
||||
source_url: "https://buildbot.libretro.com/assets/system/OpenTyrian%20%28Game%20Data%29.zip"
|
||||
source_url: "https://github.com/Abdess/retrobios/releases/download/large-files/opentyrian-data.zip"
|
||||
source_type: zip
|
||||
for_platforms: [retroarch, lakka, retropie]
|
||||
local_cache: data/opentyrian
|
||||
description: "OpenTyrian Tyrian 2.1 freeware game data"
|
||||
|
||||
# ref: syobonaction — system/syobonaction/
|
||||
# Freeware game data from OpenSyobonAction
|
||||
# Freeware game data from OpenSyobonAction (BGM, res, SE directories)
|
||||
syobonaction:
|
||||
source_url: "https://github.com/akemin-dayo/OpenSyobonAction"
|
||||
source_type: git_subtree
|
||||
source_path: "res"
|
||||
source_url: "https://github.com/akemin-dayo/OpenSyobonAction/archive/refs/heads/{version}.tar.gz"
|
||||
source_type: tarball
|
||||
source_path: "OpenSyobonAction-master"
|
||||
version: master
|
||||
local_cache: data/syobonaction
|
||||
exclude: [DxLib.cpp, DxLib.h, icon.ico, joyconfig.h, loadg.cpp, main.cpp, main.h, Makefile, README_ja.md, README.md]
|
||||
description: "Syobon Action (Cat Mario) game data (sprites, BGM, SE)"
|
||||
|
||||
# =========================================================================
|
||||
@@ -190,9 +191,10 @@ data_directories:
|
||||
# Not on buildbot — sourced from libretro repo
|
||||
# 532 files (tiles, fonts, databases, lua scripts, level descriptions)
|
||||
stonesoup:
|
||||
source_url: "https://github.com/libretro/crawl-ref"
|
||||
source_type: git_subtree
|
||||
source_path: "crawl-ref/source/dat"
|
||||
source_url: "https://github.com/libretro/crawl-ref/archive/refs/heads/{version}.tar.gz"
|
||||
source_type: tarball
|
||||
source_path: "crawl-ref-master/crawl-ref/source/dat"
|
||||
version: master
|
||||
local_cache: data/stonesoup
|
||||
description: "DCSS game data (tiles, fonts, databases, lua, level descriptions)"
|
||||
|
||||
|
||||
@@ -719,6 +719,10 @@ platforms:
|
||||
source_format: github_component_manifests
|
||||
hash_type: md5
|
||||
schedule: monthly
|
||||
contributed_by:
|
||||
- username: monster-penguin
|
||||
contribution: platform support
|
||||
pr: 36
|
||||
cores:
|
||||
- azahar
|
||||
- cemu
|
||||
@@ -758,6 +762,10 @@ platforms:
|
||||
source_format: json
|
||||
hash_type: sha1
|
||||
schedule: monthly
|
||||
contributed_by:
|
||||
- username: PixNyb
|
||||
contribution: platform support
|
||||
pr: 37
|
||||
inherits_from: emulatorjs
|
||||
target_scraper: null
|
||||
target_source: null
|
||||
|
||||
@@ -140,6 +140,20 @@ def _resolve_source(
|
||||
return None
|
||||
|
||||
|
||||
def _resolve_archive_source(
|
||||
archive_name: str,
|
||||
by_name: dict[str, list],
|
||||
by_name_lower: dict[str, str],
|
||||
data_names: set[str] | None = None,
|
||||
by_path_suffix: dict | None = None,
|
||||
) -> str:
|
||||
"""Resolve source for an archive (ZIP) name, returning a source category string."""
|
||||
result = _resolve_source(
|
||||
archive_name, by_name, by_name_lower, data_names, by_path_suffix,
|
||||
)
|
||||
return result if result is not None else "missing"
|
||||
|
||||
|
||||
def cross_reference(
|
||||
profiles: dict[str, dict],
|
||||
declared: dict[str, set[str]],
|
||||
@@ -175,6 +189,10 @@ def cross_reference(
|
||||
emu_files = profile.get("files", [])
|
||||
systems = profile.get("systems", [])
|
||||
|
||||
# Skip filename-agnostic profiles (BIOS detected without fixed names)
|
||||
if profile.get("bios_mode") == "agnostic":
|
||||
continue
|
||||
|
||||
if all_declared is not None:
|
||||
platform_names = all_declared
|
||||
else:
|
||||
@@ -184,13 +202,28 @@ def cross_reference(
|
||||
|
||||
gaps = []
|
||||
covered = []
|
||||
unsourceable_list: list[dict] = []
|
||||
archive_gaps: dict[str, dict] = {}
|
||||
seen_files: set[str] = set()
|
||||
for f in emu_files:
|
||||
fname = f.get("name", "")
|
||||
if not fname:
|
||||
if not fname or fname in seen_files:
|
||||
continue
|
||||
|
||||
# Collect unsourceable files separately (documented, not a gap)
|
||||
unsourceable_reason = f.get("unsourceable", "")
|
||||
if unsourceable_reason:
|
||||
seen_files.add(fname)
|
||||
unsourceable_list.append({
|
||||
"name": fname,
|
||||
"required": f.get("required", False),
|
||||
"reason": unsourceable_reason,
|
||||
"source_ref": f.get("source_ref", ""),
|
||||
})
|
||||
continue
|
||||
|
||||
# Skip pattern placeholders (e.g., <bios>.bin, <user-selected>.bin)
|
||||
if "<" in fname or ">" in fname:
|
||||
if "<" in fname or ">" in fname or "*" in fname:
|
||||
continue
|
||||
|
||||
# Skip UI-imported files with explicit path: null (not resolvable by pack)
|
||||
@@ -202,6 +235,61 @@ def cross_reference(
|
||||
if file_mode == "standalone":
|
||||
continue
|
||||
|
||||
# Skip files loaded from non-system directories (save_dir, content_dir)
|
||||
load_from = f.get("load_from", "")
|
||||
if load_from and load_from != "system_dir":
|
||||
continue
|
||||
|
||||
# Skip filename-agnostic files (handled by agnostic scan)
|
||||
if f.get("agnostic"):
|
||||
continue
|
||||
|
||||
archive = f.get("archive")
|
||||
|
||||
# Check platform declaration (by name or archive)
|
||||
in_platform = fname in platform_names
|
||||
if not in_platform and archive:
|
||||
in_platform = archive in platform_names
|
||||
|
||||
if in_platform:
|
||||
seen_files.add(fname)
|
||||
covered.append({
|
||||
"name": fname,
|
||||
"required": f.get("required", False),
|
||||
"in_platform": True,
|
||||
})
|
||||
continue
|
||||
|
||||
seen_files.add(fname)
|
||||
|
||||
# Group archived files by archive name
|
||||
if archive:
|
||||
if archive not in archive_gaps:
|
||||
source = _resolve_archive_source(
|
||||
archive, by_name, by_name_lower, data_names,
|
||||
by_path_suffix,
|
||||
)
|
||||
archive_gaps[archive] = {
|
||||
"name": archive,
|
||||
"required": False,
|
||||
"note": "",
|
||||
"source_ref": "",
|
||||
"in_platform": False,
|
||||
"in_repo": source != "missing",
|
||||
"source": source,
|
||||
"archive": archive,
|
||||
"archive_file_count": 0,
|
||||
"archive_required_count": 0,
|
||||
}
|
||||
entry = archive_gaps[archive]
|
||||
entry["archive_file_count"] += 1
|
||||
if f.get("required", False):
|
||||
entry["archive_required_count"] += 1
|
||||
entry["required"] = True
|
||||
if not entry["source_ref"] and f.get("source_ref"):
|
||||
entry["source_ref"] = f["source_ref"]
|
||||
continue
|
||||
|
||||
# --- resolve source provenance ---
|
||||
storage = f.get("storage", "")
|
||||
if storage in ("release", "large_file"):
|
||||
@@ -235,22 +323,21 @@ def cross_reference(
|
||||
source = "missing"
|
||||
|
||||
in_repo = source != "missing"
|
||||
in_platform = fname in platform_names
|
||||
|
||||
entry = {
|
||||
"name": fname,
|
||||
"required": f.get("required", False),
|
||||
"note": f.get("note", ""),
|
||||
"source_ref": f.get("source_ref", ""),
|
||||
"in_platform": in_platform,
|
||||
"in_platform": False,
|
||||
"in_repo": in_repo,
|
||||
"source": source,
|
||||
}
|
||||
gaps.append(entry)
|
||||
|
||||
if not in_platform:
|
||||
gaps.append(entry)
|
||||
else:
|
||||
covered.append(entry)
|
||||
# Append grouped archive gaps
|
||||
for ag in sorted(archive_gaps.values(), key=lambda e: e["name"]):
|
||||
gaps.append(ag)
|
||||
|
||||
report[emu_name] = {
|
||||
"emulator": profile.get("emulator", emu_name),
|
||||
@@ -264,6 +351,7 @@ def cross_reference(
|
||||
"gap_data": sum(1 for g in gaps if g["source"] == "data"),
|
||||
"gap_large_file": sum(1 for g in gaps if g["source"] == "large_file"),
|
||||
"gap_details": gaps,
|
||||
"unsourceable": unsourceable_list,
|
||||
}
|
||||
|
||||
return report
|
||||
@@ -301,7 +389,12 @@ def print_report(report: dict) -> None:
|
||||
req = "*" if g["required"] else " "
|
||||
src = g.get("source", "missing").upper()
|
||||
note = f" -- {g['note']}" if g["note"] else ""
|
||||
print(f" {req} {g['name']} [{src}]{note}")
|
||||
archive_info = ""
|
||||
if g.get("archive"):
|
||||
fc = g.get("archive_file_count", 0)
|
||||
rc = g.get("archive_required_count", 0)
|
||||
archive_info = f" ({fc} files, {rc} required)"
|
||||
print(f" {req} {g['name']} [{src}]{archive_info}{note}")
|
||||
|
||||
total_gaps += gaps
|
||||
for key in totals:
|
||||
|
||||
@@ -758,6 +758,7 @@ def _build_readme(
|
||||
total_files: int,
|
||||
num_systems: int,
|
||||
source: str = "full",
|
||||
contributors: list[dict] | None = None,
|
||||
) -> str:
|
||||
"""Build a personalized step-by-step README for each platform pack."""
|
||||
sep = "=" * 50
|
||||
@@ -971,7 +972,18 @@ def _build_readme(
|
||||
" 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", "")
|
||||
contribution = cb.get("contribution", "")
|
||||
pr = cb.get("pr")
|
||||
pr_ref = f" (#{pr})" if pr else ""
|
||||
credits += f" @{username} - {contribution}{pr_ref}\n"
|
||||
credits += "\n"
|
||||
|
||||
return header + source_info + guide + credits + footer
|
||||
|
||||
|
||||
def _build_agnostic_rename_readme(
|
||||
@@ -1482,9 +1494,15 @@ def generate_pack(
|
||||
|
||||
# README.txt for users -personalized step-by-step per platform
|
||||
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(
|
||||
platform_name, platform_display, base_dest, total_files, num_systems,
|
||||
source=source,
|
||||
contributors=_pack_registry.get(platform_name, {}).get("contributed_by", []),
|
||||
)
|
||||
zf.writestr("README.txt", readme_text)
|
||||
|
||||
|
||||
@@ -375,6 +375,16 @@ def generate_contributing() -> str:
|
||||
3. Variants (alternate hashes): `bios/Manufacturer/Console/.variants/`
|
||||
4. Create a Pull Request - checksums are verified automatically
|
||||
|
||||
## Add a new platform
|
||||
|
||||
1. Write a scraper in `scripts/scraper/`
|
||||
2. Create the platform YAML in `platforms/`
|
||||
3. Register in `platforms/_registry.yml`
|
||||
4. Submit a Pull Request
|
||||
|
||||
Contributors who add platform support are credited in the README,
|
||||
on the documentation site, and in the BIOS packs.
|
||||
|
||||
## File conventions
|
||||
|
||||
- Files >50 MB go in GitHub release assets (`large-files` release)
|
||||
|
||||
@@ -127,11 +127,22 @@ def _build_system_page_map_from_data(
|
||||
break
|
||||
|
||||
|
||||
def _slugify_anchor(text: str) -> str:
|
||||
"""Slugify text for MkDocs anchor compatibility."""
|
||||
import re
|
||||
|
||||
slug = text.lower()
|
||||
slug = re.sub(r"[^\w\s-]", "", slug)
|
||||
slug = re.sub(r"[\s]+", "-", slug)
|
||||
slug = slug.strip("-")
|
||||
return slug
|
||||
|
||||
|
||||
def _system_link(sys_id: str, prefix: str = "") -> str:
|
||||
"""Generate a markdown link to a system page with anchor."""
|
||||
if sys_id in _system_page_map:
|
||||
slug, console = _system_page_map[sys_id]
|
||||
anchor = console.lower().replace(" ", "-").replace("/", "-")
|
||||
anchor = _slugify_anchor(console)
|
||||
return f"[{sys_id}]({prefix}systems/{slug}.md#{anchor})"
|
||||
return sys_id
|
||||
|
||||
@@ -239,7 +250,9 @@ def generate_home(
|
||||
# Classification stats
|
||||
classifications: dict[str, int] = {}
|
||||
for p in unique.values():
|
||||
cls = p.get("core_classification", "unclassified")
|
||||
cls = p.get("core_classification", "other")
|
||||
if cls not in CLS_LABELS or cls == "unclassified":
|
||||
cls = "other"
|
||||
classifications[cls] = classifications.get(cls, 0) + 1
|
||||
|
||||
# Count total systems across all profiles
|
||||
@@ -318,10 +331,13 @@ def generate_home(
|
||||
" |----------|-----------|",
|
||||
" | RetroArch / Lakka | `system/` |",
|
||||
" | Batocera | `/userdata/bios/` |",
|
||||
" | BizHawk | `Firmware/` |",
|
||||
" | EmuDeck | `Emulation/bios/` |",
|
||||
" | Recalbox | `/recalbox/share/bios/` |",
|
||||
" | RetroBat | `bios/` |",
|
||||
" | RetroDECK | `~/retrodeck/bios/` |",
|
||||
" | EmuDeck | `Emulation/bios/` |",
|
||||
" | RetroPie | `~/RetroPie/BIOS/` |",
|
||||
" | RomM | `bios/{platform_slug}/` |",
|
||||
"",
|
||||
]
|
||||
)
|
||||
@@ -497,6 +513,17 @@ def generate_platform_page(
|
||||
lines.append(f"| BIOS path | `{base_dest}/` |")
|
||||
if homepage:
|
||||
lines.append(f"| Homepage | [{homepage}]({homepage}) |")
|
||||
contrib_list = (registry or {}).get(name, {}).get("contributed_by", [])
|
||||
if contrib_list:
|
||||
for cb in contrib_list:
|
||||
username = cb.get("username", "")
|
||||
contribution = cb.get("contribution", "")
|
||||
pr = cb.get("pr")
|
||||
pr_link = f" ([#{pr}]({REPO_URL}/pull/{pr}))" if pr else ""
|
||||
lines.append(
|
||||
f"| Contributed by | [@{username}](https://github.com/{username})"
|
||||
f" - {contribution}{pr_link} |"
|
||||
)
|
||||
lines.extend(
|
||||
[
|
||||
"",
|
||||
@@ -865,7 +892,11 @@ def generate_emulators_index(profiles: dict) -> str:
|
||||
|
||||
|
||||
def generate_emulator_page(
|
||||
name: str, profile: dict, db: dict, platform_files: dict | None = None
|
||||
name: str,
|
||||
profile: dict,
|
||||
db: dict,
|
||||
platform_files: dict | None = None,
|
||||
data_names: set[str] | None = None,
|
||||
) -> str:
|
||||
if profile.get("type") == "alias":
|
||||
parent = profile.get("alias_of", profile.get("bios_identical_to", "unknown"))
|
||||
@@ -878,8 +909,10 @@ def generate_emulator_page(
|
||||
emu_name = profile.get("emulator", name)
|
||||
emu_type = profile.get("type", "unknown")
|
||||
classification = profile.get("core_classification", "")
|
||||
source = profile.get("source", "")
|
||||
upstream = profile.get("upstream", "")
|
||||
source_raw = profile.get("source", "")
|
||||
source = str(source_raw) if not isinstance(source_raw, dict) else ""
|
||||
upstream_raw = profile.get("upstream", "")
|
||||
upstream = str(upstream_raw) if not isinstance(upstream_raw, dict) else ""
|
||||
version = profile.get("core_version", "unknown")
|
||||
profile.get("display_name", emu_name)
|
||||
profiled = profile.get("profiled_date", "unknown")
|
||||
@@ -905,10 +938,32 @@ def generate_emulator_page(
|
||||
if classification:
|
||||
cls_display = CLS_LABELS.get(classification, classification)
|
||||
lines.append(f"| Classification | {cls_display} |")
|
||||
if source:
|
||||
lines.append(f"| Source | [{source}]({source}) |")
|
||||
if upstream and upstream != source:
|
||||
lines.append(f"| Upstream | [{upstream}]({upstream}) |")
|
||||
if isinstance(source_raw, dict):
|
||||
parts = []
|
||||
for k, v in source_raw.items():
|
||||
if isinstance(v, str) and v.startswith("http"):
|
||||
parts.append(f"[{k}]({v})")
|
||||
else:
|
||||
parts.append(f"{k}: {v}")
|
||||
lines.append(f"| Source | {', '.join(parts)} |")
|
||||
elif source:
|
||||
if source.startswith("http"):
|
||||
lines.append(f"| Source | [{source}]({source}) |")
|
||||
else:
|
||||
lines.append(f"| Source | {source} |")
|
||||
if isinstance(upstream_raw, dict):
|
||||
parts = []
|
||||
for k, v in upstream_raw.items():
|
||||
if isinstance(v, str) and v.startswith("http"):
|
||||
parts.append(f"[{k}]({v})")
|
||||
else:
|
||||
parts.append(f"{k}: {v}")
|
||||
lines.append(f"| Upstream | {', '.join(parts)} |")
|
||||
elif upstream and upstream != source:
|
||||
if upstream.startswith("http"):
|
||||
lines.append(f"| Upstream | [{upstream}]({upstream}) |")
|
||||
else:
|
||||
lines.append(f"| Upstream | {upstream} |")
|
||||
lines.append(f"| Version | {version} |")
|
||||
lines.append(f"| Profiled | {profiled} |")
|
||||
if cores:
|
||||
@@ -1022,15 +1077,52 @@ def generate_emulator_page(
|
||||
]
|
||||
)
|
||||
else:
|
||||
from cross_reference import _resolve_source
|
||||
|
||||
by_name = db.get("indexes", {}).get("by_name", {})
|
||||
db.get("files", {})
|
||||
by_name_lower = {k.lower(): k for k in by_name}
|
||||
by_path_suffix = db.get("indexes", {}).get("by_path_suffix", {})
|
||||
by_md5 = db.get("indexes", {}).get("by_md5", {})
|
||||
db_files = db.get("files", {})
|
||||
|
||||
def _file_available(f: dict) -> bool:
|
||||
"""Check if a file is available using the same resolution as cross_reference."""
|
||||
fname = f.get("name", "")
|
||||
if not fname:
|
||||
return False
|
||||
storage = f.get("storage", "")
|
||||
if storage in ("release", "large_file"):
|
||||
return True
|
||||
src = _resolve_source(
|
||||
fname, by_name, by_name_lower, data_names, by_path_suffix,
|
||||
)
|
||||
if src is not None:
|
||||
return True
|
||||
path_field = f.get("path", "")
|
||||
if path_field and path_field != fname:
|
||||
src = _resolve_source(
|
||||
path_field, by_name, by_name_lower, data_names,
|
||||
by_path_suffix,
|
||||
)
|
||||
if src is not None:
|
||||
return True
|
||||
md5_raw = f.get("md5", "")
|
||||
if md5_raw:
|
||||
for md5_val in md5_raw.split(","):
|
||||
md5_val = md5_val.strip().lower()
|
||||
if md5_val and by_md5.get(md5_val):
|
||||
return True
|
||||
sha1 = f.get("sha1", "")
|
||||
if sha1 and sha1 in db_files:
|
||||
return True
|
||||
return False
|
||||
|
||||
# Stats by category
|
||||
bios_files = [f for f in files if f.get("category", "bios") == "bios"]
|
||||
game_data = [f for f in files if f.get("category") == "game_data"]
|
||||
bios_zips = [f for f in files if f.get("category") == "bios_zip"]
|
||||
|
||||
in_repo_count = sum(1 for f in files if f.get("name", "") in by_name)
|
||||
in_repo_count = sum(1 for f in files if _file_available(f))
|
||||
missing_count = len(files) - in_repo_count
|
||||
req_count = sum(1 for f in files if f.get("required"))
|
||||
opt_count = len(files) - req_count
|
||||
@@ -1058,7 +1150,7 @@ def generate_emulator_page(
|
||||
for f in files:
|
||||
fname = f.get("name", "")
|
||||
required = f.get("required", False)
|
||||
in_repo = fname in by_name
|
||||
in_repo = _file_available(f)
|
||||
source_ref = f.get("source_ref", "")
|
||||
mode = f.get("mode", "")
|
||||
hle = f.get("hle_fallback", False)
|
||||
@@ -1176,7 +1268,10 @@ def generate_emulator_page(
|
||||
if fsystem:
|
||||
details.append(f"System: {_system_link(fsystem, '../')}")
|
||||
if size:
|
||||
size_str = _fmt_size(size)
|
||||
if isinstance(size, list):
|
||||
size_str = " / ".join(_fmt_size(s) for s in size)
|
||||
else:
|
||||
size_str = _fmt_size(size)
|
||||
if fmin or fmax:
|
||||
bounds = []
|
||||
if fmin:
|
||||
@@ -1501,19 +1596,32 @@ def generate_gap_analysis(
|
||||
|
||||
# ---- Section 3: Core complement (cross-reference provenance) ----
|
||||
|
||||
from common import expand_platform_declared_names
|
||||
|
||||
all_declared: set[str] = set()
|
||||
declared: dict[str, set[str]] = {}
|
||||
for _name, cov in coverages.items():
|
||||
config = cov["config"]
|
||||
# Enrich with alias resolution (MD5 -> SHA1 -> canonical name + aliases)
|
||||
all_declared.update(expand_platform_declared_names(config, db))
|
||||
for sys_id, system in config.get("systems", {}).items():
|
||||
for fe in system.get("files", []):
|
||||
fname = fe.get("name", "")
|
||||
if fname:
|
||||
declared.setdefault(sys_id, set()).add(fname)
|
||||
all_declared.add(fname)
|
||||
|
||||
# Only include profiles relevant to at least one platform
|
||||
unique_profiles = {
|
||||
k: v
|
||||
for k, v in profiles.items()
|
||||
if v.get("type") not in ("alias", "test")
|
||||
}
|
||||
relevant_set: set[str] = set()
|
||||
for _name, cov in coverages.items():
|
||||
matched = resolve_platform_cores(cov["config"], unique_profiles)
|
||||
relevant_set.update(matched)
|
||||
active_profiles = {
|
||||
k: v for k, v in profiles.items() if v.get("type") != "alias"
|
||||
k: v for k, v in unique_profiles.items() if k in relevant_set
|
||||
}
|
||||
|
||||
report = run_cross_reference(
|
||||
@@ -1641,6 +1749,35 @@ def generate_gap_analysis(
|
||||
)
|
||||
lines.append("")
|
||||
|
||||
# ---- Section 4: Acknowledged gaps (unsourceable files) ----
|
||||
|
||||
all_unsourceable: list[dict] = []
|
||||
for emu_name, data in sorted(report.items()):
|
||||
for u in data.get("unsourceable", []):
|
||||
all_unsourceable.append({
|
||||
"name": u["name"],
|
||||
"emulator": data["emulator"],
|
||||
"reason": u["reason"],
|
||||
"source_ref": u.get("source_ref", ""),
|
||||
})
|
||||
|
||||
if all_unsourceable:
|
||||
lines.extend([
|
||||
"## Acknowledged Gaps",
|
||||
"",
|
||||
f"{len(all_unsourceable)} files documented as unsourceable "
|
||||
"(verified from source code).",
|
||||
"",
|
||||
"| File | Emulator | Reason | Source ref |",
|
||||
"|------|----------|--------|-----------|",
|
||||
])
|
||||
for u in sorted(all_unsourceable, key=lambda x: x["name"]):
|
||||
lines.append(
|
||||
f"| `{u['name']}` | {u['emulator']} | {u['reason']} "
|
||||
f"| {u['source_ref']} |"
|
||||
)
|
||||
lines.append("")
|
||||
|
||||
lines.extend(["", f'<div class="rb-timestamp">Generated on {_timestamp()}.</div>'])
|
||||
return "\n".join(lines) + "\n"
|
||||
|
||||
@@ -1727,8 +1864,10 @@ def generate_cross_reference(
|
||||
cls_raw = p.get("core_classification", "-")
|
||||
cls = CLS_LABELS.get(cls_raw, cls_raw)
|
||||
p.get("type", "")
|
||||
upstream = p.get("upstream", "")
|
||||
source = p.get("source", "")
|
||||
upstream_raw2 = p.get("upstream", "")
|
||||
upstream = str(upstream_raw2) if not isinstance(upstream_raw2, dict) else ""
|
||||
source_raw2 = p.get("source", "")
|
||||
source = str(source_raw2) if not isinstance(source_raw2, dict) else ""
|
||||
systems = p.get("systems", [])
|
||||
files = p.get("files", [])
|
||||
|
||||
@@ -1750,12 +1889,16 @@ def generate_cross_reference(
|
||||
file_str += f" ({', '.join(parts)})"
|
||||
|
||||
upstream_display = "-"
|
||||
if upstream:
|
||||
if upstream and upstream.startswith("http"):
|
||||
upstream_short = upstream.replace("https://github.com/", "")
|
||||
upstream_display = f"[{upstream_short}]({upstream})"
|
||||
elif source:
|
||||
elif upstream:
|
||||
upstream_display = upstream
|
||||
elif source and source.startswith("http"):
|
||||
source_short = source.replace("https://github.com/", "")
|
||||
upstream_display = f"[{source_short}]({source})"
|
||||
elif source:
|
||||
upstream_display = source
|
||||
|
||||
lines.append(
|
||||
f" | [{emu_display}](emulators/{emu_name}.md) | {cls} | "
|
||||
@@ -1777,9 +1920,10 @@ def generate_cross_reference(
|
||||
# Group profiles by upstream
|
||||
by_upstream: dict[str, list[str]] = {}
|
||||
for emu_name, p in sorted(unique.items()):
|
||||
upstream = p.get("upstream", p.get("source", ""))
|
||||
if upstream:
|
||||
by_upstream.setdefault(upstream, []).append(emu_name)
|
||||
raw_up = p.get("upstream", p.get("source", ""))
|
||||
up_str = str(raw_up) if not isinstance(raw_up, dict) else ""
|
||||
if up_str:
|
||||
by_upstream.setdefault(up_str, []).append(emu_name)
|
||||
|
||||
# Build platform membership per core
|
||||
platform_membership: dict[str, set[str]] = {}
|
||||
@@ -1813,8 +1957,12 @@ def generate_cross_reference(
|
||||
plat_str = ", ".join(sorted(all_plats)) if all_plats else "-"
|
||||
core_links = ", ".join(f"[{c}](emulators/{c}.md)" for c in sorted(cores))
|
||||
|
||||
if upstream_url.startswith("http"):
|
||||
upstream_cell = f"[{upstream_short}]({upstream_url})"
|
||||
else:
|
||||
upstream_cell = upstream_short
|
||||
lines.append(
|
||||
f"| [{upstream_short}]({upstream_url}) | {core_links} | "
|
||||
f"| {upstream_cell} | {core_links} | "
|
||||
f"{cls_str} | {plat_str} |"
|
||||
)
|
||||
|
||||
@@ -1876,6 +2024,7 @@ def generate_wiki_data_model(db: dict, profiles: dict) -> str:
|
||||
by_name = len(db.get("indexes", {}).get("by_name", {}))
|
||||
by_crc32 = len(db.get("indexes", {}).get("by_crc32", {}))
|
||||
by_path = len(db.get("indexes", {}).get("by_path_suffix", {}))
|
||||
by_sha256 = len(db.get("indexes", {}).get("by_sha256", {}))
|
||||
|
||||
lines = [
|
||||
f"# Data model - {SITE_NAME}",
|
||||
@@ -1907,6 +2056,7 @@ def generate_wiki_data_model(db: dict, profiles: dict) -> str:
|
||||
f"| `by_name` | {by_name} | filename to SHA1 list (name-based resolution) |",
|
||||
f"| `by_crc32` | {by_crc32} | CRC32 to SHA1 lookup |",
|
||||
f"| `by_path_suffix` | {by_path} | relative path to SHA1 (regional variant disambiguation) |",
|
||||
f"| `by_sha256` | {by_sha256} | SHA256 to SHA1 lookup (emulator profile validation) |",
|
||||
"",
|
||||
"### File resolution order",
|
||||
"",
|
||||
@@ -1919,6 +2069,8 @@ def generate_wiki_data_model(db: dict, profiles: dict) -> str:
|
||||
"5. Name + alias with md5_composite / direct MD5 per candidate",
|
||||
"6. zippedFile content match via inner ROM MD5 index",
|
||||
"7. MAME clone fallback (deduped ZIP mapped to canonical name)",
|
||||
"8. Data directory scan (exact path then case-insensitive basename walk)",
|
||||
"9. Agnostic fallback (size-constrained match under system path prefix)",
|
||||
"",
|
||||
"## Platform YAML",
|
||||
"",
|
||||
@@ -2187,7 +2339,7 @@ def main():
|
||||
str(docs / "emulators" / "index.md"), generate_emulators_index(profiles)
|
||||
)
|
||||
for name, profile in profiles.items():
|
||||
page = generate_emulator_page(name, profile, db, platform_files)
|
||||
page = generate_emulator_page(name, profile, db, platform_files, suppl_names)
|
||||
write_if_changed(str(docs / "emulators" / f"{name}.md"), page)
|
||||
|
||||
# Generate cross-reference page
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Scraper for RetroDECK BIOS requirements.
|
||||
|
||||
Platform contributed by @monster-penguin (#36).
|
||||
|
||||
Source: https://github.com/RetroDECK/components
|
||||
Format: component_manifest.json per component directory
|
||||
Hash: MD5 (primary), SHA256 for some entries (melonDS DSi)
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Scraper for RomM BIOS requirements.
|
||||
|
||||
Platform contributed by @PixNyb (#37).
|
||||
|
||||
Source: https://github.com/rommapp/romm
|
||||
Format: JSON fixture mapping "slug:filename" to {size, crc, md5, sha1}
|
||||
Hash: SHA1 primary (all four hashes available per entry)
|
||||
|
||||
@@ -102,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)
|
||||
# Size checks
|
||||
if "size" in checks:
|
||||
if f.get("size") is not None:
|
||||
index[fname]["sizes"].add(f["size"])
|
||||
raw_size = f.get("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:
|
||||
cur = index[fname]["min_size"]
|
||||
index[fname]["min_size"] = (
|
||||
|
||||
@@ -298,13 +298,23 @@ def _name_in_index(
|
||||
by_name: dict,
|
||||
by_path_suffix: dict | None = None,
|
||||
data_names: set[str] | None = None,
|
||||
by_name_lower: dict[str, str] | None = None,
|
||||
) -> bool:
|
||||
"""Check if a name is resolvable in the database indexes or data directories."""
|
||||
# Strip trailing slash for directory-type entries (e.g. nestopia/samples/foo/)
|
||||
name = name.rstrip("/")
|
||||
if name in by_name:
|
||||
return True
|
||||
basename = name.rsplit("/", 1)[-1]
|
||||
basename = name.rsplit("/", 1)[-1] if "/" in name else name
|
||||
if basename != name and basename in by_name:
|
||||
return True
|
||||
# Case-insensitive by_name lookup
|
||||
if by_name_lower:
|
||||
key = name.lower()
|
||||
if key in by_name_lower:
|
||||
return True
|
||||
if basename != name and basename.lower() in by_name_lower:
|
||||
return True
|
||||
if by_path_suffix and name in by_path_suffix:
|
||||
return True
|
||||
if data_names:
|
||||
@@ -345,6 +355,7 @@ def find_undeclared_files(
|
||||
declared_dd.add(ref)
|
||||
|
||||
by_name = db.get("indexes", {}).get("by_name", {})
|
||||
by_name_lower = {k.lower(): k for k in by_name}
|
||||
by_path_suffix = db.get("indexes", {}).get("by_path_suffix", {})
|
||||
profiles = (
|
||||
emu_profiles
|
||||
@@ -378,6 +389,10 @@ def find_undeclared_files(
|
||||
fname = f.get("name", "")
|
||||
if not fname or fname in seen_files:
|
||||
continue
|
||||
# Skip unsourceable files (documented reason, not a gap)
|
||||
if f.get("unsourceable"):
|
||||
seen_files.add(fname)
|
||||
continue
|
||||
# Skip pattern placeholders (e.g., <user-selected>.bin)
|
||||
if "<" in fname or ">" in fname or "*" in fname:
|
||||
continue
|
||||
@@ -416,7 +431,8 @@ def find_undeclared_files(
|
||||
if archive:
|
||||
if archive not in archive_entries:
|
||||
in_repo = _name_in_index(
|
||||
archive, by_name, by_path_suffix, data_names
|
||||
archive, by_name, by_path_suffix, data_names,
|
||||
by_name_lower,
|
||||
)
|
||||
archive_entries[archive] = {
|
||||
"emulator": profile.get("emulator", emu_name),
|
||||
@@ -447,11 +463,20 @@ def find_undeclared_files(
|
||||
else:
|
||||
dest = f.get("path") or fname
|
||||
|
||||
# Resolution: try name, then path basename, then path_suffix
|
||||
in_repo = _name_in_index(fname, by_name, by_path_suffix, data_names)
|
||||
if not in_repo and dest != fname:
|
||||
path_base = dest.rsplit("/", 1)[-1]
|
||||
in_repo = _name_in_index(path_base, by_name, by_path_suffix, data_names)
|
||||
# Resolution: storage flag, then name, then path basename
|
||||
storage = f.get("storage", "")
|
||||
if storage in ("release", "large_file"):
|
||||
in_repo = True
|
||||
else:
|
||||
in_repo = _name_in_index(
|
||||
fname, by_name, by_path_suffix, data_names, by_name_lower,
|
||||
)
|
||||
if not in_repo and dest != fname:
|
||||
path_base = dest.rsplit("/", 1)[-1]
|
||||
in_repo = _name_in_index(
|
||||
path_base, by_name, by_path_suffix, data_names,
|
||||
by_name_lower,
|
||||
)
|
||||
|
||||
checks = _parse_validation(f.get("validation"))
|
||||
undeclared.append(
|
||||
@@ -1230,13 +1255,24 @@ def verify_emulator(
|
||||
check = check_file_validation(local_path, name, validation_index)
|
||||
if check:
|
||||
reason, _emus = check
|
||||
result = {
|
||||
"name": name,
|
||||
"status": Status.UNTESTED,
|
||||
"required": required,
|
||||
"path": local_path,
|
||||
"reason": reason,
|
||||
}
|
||||
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 = {
|
||||
"name": name,
|
||||
"status": Status.UNTESTED,
|
||||
"required": required,
|
||||
"path": local_path,
|
||||
"reason": reason,
|
||||
}
|
||||
else:
|
||||
result = {
|
||||
"name": name,
|
||||
|
||||
@@ -324,10 +324,13 @@ python scripts/pipeline.py --offline
|
||||
This executes in sequence:
|
||||
|
||||
1. `generate_db.py` - rebuild `database.json` from `bios/`
|
||||
2. `refresh_data_dirs.py` - update data directories
|
||||
2. `refresh_data_dirs.py` - update data directories (skipped with `--offline`)
|
||||
3. `verify.py --all` - verify all platforms including the new one
|
||||
4. `generate_pack.py --all` - build ZIP packs
|
||||
4. `generate_pack.py --all` - build ZIP packs + install manifests
|
||||
5. Consistency check - verify counts match between verify and pack
|
||||
6. Pack integrity - extract ZIPs and verify hashes per platform mode
|
||||
7. `generate_readme.py` - regenerate README
|
||||
8. `generate_site.py` - regenerate documentation site
|
||||
|
||||
Check the output for:
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ Upstream sources Scrapers parse generate_db.py scans
|
||||
batocera-systems builds database.json
|
||||
es_bios.xml (recalbox) (SHA1 primary key,
|
||||
core-info .info files indexes: by_md5, by_name,
|
||||
FirmwareDatabase.cs by_crc32, by_path_suffix)
|
||||
FirmwareDatabase.cs by_crc32, by_sha256, by_path_suffix)
|
||||
MAME/FBNeo source
|
||||
|
||||
emulators/*.yml verify.py checks generate_pack.py resolves
|
||||
@@ -236,11 +236,11 @@ user's platform, filter files by hardware target, and download with SHA1 verific
|
||||
|
||||
## Tests
|
||||
|
||||
5 test files, 249 tests total:
|
||||
5 test files, 259 tests total:
|
||||
|
||||
| File | Tests | Coverage |
|
||||
|------|-------|----------|
|
||||
| `test_e2e.py` | 186 | file resolution, verification, severity, cross-reference, aliases, inheritance, shared groups, data dirs, storage tiers, HLE, launchers, platform grouping, core resolution, target filtering, truth/diff, exporters |
|
||||
| `test_e2e.py` | 196 | file resolution, verification, severity, cross-reference, aliases, inheritance, shared groups, data dirs, storage tiers, HLE, launchers, platform grouping, core resolution, target filtering, truth/diff, exporters |
|
||||
| `test_pack_integrity.py` | 8 | extract ZIP packs to disk, verify paths + hashes per platform's native mode |
|
||||
| `test_mame_parser.py` | 22 | BIOS root set detection, ROM block parsing, macro expansion |
|
||||
| `test_fbneo_parser.py` | 16 | BIOS set detection, ROM info parsing |
|
||||
@@ -254,7 +254,7 @@ python -m unittest tests.test_e2e -v
|
||||
|
||||
| Workflow | File | Trigger | Role |
|
||||
|----------|------|---------|------|
|
||||
| Build & Release | `build.yml` | `workflow_dispatch` (manual) | restore large files, build packs, create GitHub release |
|
||||
| Build & Release | `build.yml` | push to main (bios/, platforms/) + manual | restore large files, build packs, create GitHub release |
|
||||
| Deploy Site | `deploy-site.yml` | push to main (platforms, emulators, wiki, scripts) + manual | generate site, build with MkDocs, deploy to GitHub Pages |
|
||||
| PR Validation | `validate.yml` | pull request on `bios/`/`platforms/` | validate BIOS hashes, schema check, run tests, auto-label PR |
|
||||
| Weekly Sync | `watch.yml` | cron (Monday 6 AM UTC) + manual | scrape upstream sources, detect changes, create update PR |
|
||||
|
||||
@@ -89,13 +89,15 @@ A hash is a fixed-length fingerprint computed from a file's contents. If even on
|
||||
| SHA1 | 40 hex chars | `10155d8d6e6e832d8ea1571511e40dfb15fede05` |
|
||||
| CRC32 | 8 hex chars | `2F468B96` |
|
||||
|
||||
Different platforms use different hash types for verification. Batocera uses MD5, RetroArch checks existence only, and RomM accepts any of the three.
|
||||
Different platforms use different hash types for verification. Batocera uses MD5, RetroArch checks existence only, BizHawk uses SHA1, and RomM uses MD5.
|
||||
|
||||
## Why does my verification report say UNTESTED?
|
||||
|
||||
UNTESTED means the file exists on disk but its hash was not confirmed against a known value. This happens on existence-mode platforms (RetroArch, Lakka, RetroPie) where the platform only checks that the file is present, without verifying its contents.
|
||||
UNTESTED means the file exists on disk but its hash does not match the expected value. This happens on MD5/SHA1-mode platforms (Batocera, Recalbox, BizHawk, etc.) when the file is present but contains different data than what the platform declares.
|
||||
|
||||
The file may still be correct. Running `verify.py --emulator <core> --verbose` shows the emulator-level ground truth, which can confirm whether the file's hash matches what the source code expects.
|
||||
On existence-mode platforms (RetroArch, Lakka, RetroPie), files are never UNTESTED because the platform only checks presence, not content. Those files show as OK if present.
|
||||
|
||||
Running `verify.py --emulator <core> --verbose` shows the emulator-level ground truth, which can confirm whether the file's hash matches what the source code expects.
|
||||
|
||||
## Can I use BIOS from one platform on another?
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ Relative to the RetroBat installation directory (e.g., `C:\RetroBat\bios\`).
|
||||
### RetroDECK
|
||||
|
||||
```
|
||||
~/.var/app/net.retrodeck.retrodeck/retrodeck/bios/
|
||||
~/retrodeck/bios/
|
||||
```
|
||||
|
||||
### EmuDeck
|
||||
|
||||
@@ -7,7 +7,7 @@ Technical documentation for the RetroBIOS toolchain.
|
||||
- **[Getting started](getting-started.md)** - installation, BIOS directory paths per platform, verification
|
||||
- **[FAQ](faq.md)** - common questions, troubleshooting, hash explanations
|
||||
|
||||
If you just want to download BIOS packs, see the [home page](../index.md).
|
||||
If you just want to download BIOS packs, see the [home page](../README.md).
|
||||
|
||||
## Technical reference
|
||||
|
||||
@@ -26,14 +26,14 @@ If you just want to download BIOS packs, see the [home page](../index.md).
|
||||
- **[Testing guide](testing-guide.md)** - run tests, fixture pattern, how to add tests, CI integration
|
||||
- **[Release process](release-process.md)** - CI workflows, large files, manual release
|
||||
|
||||
See [contributing](../contributing.md) for submission guidelines.
|
||||
See [contributing](../CONTRIBUTING.md) for submission guidelines.
|
||||
|
||||
## Glossary
|
||||
|
||||
- **BIOS** - firmware burned into console hardware, needed by emulators that rely on original boot code
|
||||
- **firmware** - system software loaded by a console at boot; used interchangeably with BIOS in this project
|
||||
- **HLE** - High-Level Emulation; software reimplementation of BIOS functions, avoids needing the original file
|
||||
- **hash** - fixed-length fingerprint of a file's contents; this project uses MD5, SHA1, SHA256, and CRC32
|
||||
- **hash** - fixed-length fingerprint of a file's contents; this project uses MD5, SHA1, SHA256, CRC32, and Adler-32
|
||||
- **platform** - a distribution that packages emulators (RetroArch, Batocera, Recalbox, EmuDeck, etc.)
|
||||
- **core** - an emulator packaged as a libretro plugin, loaded by RetroArch or compatible frontends
|
||||
- **profile** - a YAML file in `emulators/` documenting one core's BIOS requirements, verified against source code
|
||||
|
||||
@@ -250,7 +250,7 @@ even if documentation mentions it.
|
||||
|-------|----------|-------------|
|
||||
| `emulator` | yes | display name |
|
||||
| `type` | yes | `libretro`, `standalone`, `standalone + libretro`, `alias`, `launcher`, `game`, `utility`, `test` |
|
||||
| `core_classification` | no | `pure_libretro`, `official_port`, `community_fork`, `frozen_snapshot`, `enhanced_fork`, `game_engine`, `embedded_hle`, `alias`, `launcher` |
|
||||
| `core_classification` | no | `pure_libretro`, `official_port`, `community_fork`, `frozen_snapshot`, `enhanced_fork`, `game_engine`, `embedded_hle`, `launcher`, `other` |
|
||||
| `source` | yes | libretro core repository URL |
|
||||
| `upstream` | no | original emulator repository URL |
|
||||
| `profiled_date` | yes | date of source analysis |
|
||||
@@ -276,6 +276,7 @@ even if documentation mentions it.
|
||||
| `size` | expected size in bytes |
|
||||
| `min_size`, `max_size` | size range when the code accepts a range |
|
||||
| `md5`, `sha1`, `crc32`, `sha256` | expected hashes from source code |
|
||||
| `known_hash_adler32` | expected Adler-32 hash (used by Dolphin IPL files) |
|
||||
| `validation` | checks the code performs: `size`, `crc32`, `md5`, `sha1`, `adler32`, `signature`, `crypto`. Can be a list or dict `{core: [...], upstream: [...]}` for divergent checks |
|
||||
| `aliases` | alternate filenames for the same file |
|
||||
| `mode` | `libretro`, `standalone`, or `both` |
|
||||
@@ -288,4 +289,7 @@ even if documentation mentions it.
|
||||
| `note` | additional context |
|
||||
| `contents` | structure of files inside a BIOS ZIP (`name`, `description`, `size`, `crc32`) |
|
||||
| `storage` | `large_file` for files > 50 MB stored as release assets |
|
||||
| `agnostic` | true if any file under the system path within size constraints satisfies the requirement |
|
||||
| `unsourceable` | reason why the file cannot be sourced (acknowledged gap) |
|
||||
| `destination` | target path within the BIOS directory |
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ Run everything in sequence:
|
||||
|
||||
```bash
|
||||
python scripts/pipeline.py --offline # DB + verify + packs + manifests + integrity + readme + site
|
||||
python scripts/pipeline.py --offline --skip-packs # DB + verify only
|
||||
python scripts/pipeline.py --offline --skip-packs # DB + verify + readme + site
|
||||
python scripts/pipeline.py --offline --skip-docs # skip readme + site generation
|
||||
python scripts/pipeline.py --offline --target switch # filter by hardware target
|
||||
python scripts/pipeline.py --offline --with-truth # include truth generation + diff
|
||||
|
||||
@@ -18,8 +18,8 @@ cannot start games for that system at all.
|
||||
|
||||
**Check if the hash matches:**
|
||||
|
||||
Look for `HASH_MISMATCH` in the verify output. This means the file exists but
|
||||
contains different data than expected. Common causes:
|
||||
Look for `untested` entries in the verify output. This means the file exists but
|
||||
its hash does not match the expected value. Common causes:
|
||||
|
||||
- Wrong region (a PAL BIOS instead of NTSC, or vice versa)
|
||||
- Wrong hardware revision (e.g. SCPH-5501 vs SCPH-1001 for PlayStation)
|
||||
@@ -72,13 +72,11 @@ filename from the emulator profile.
|
||||
|
||||
## Hash mismatch / UNTESTED
|
||||
|
||||
`verify.py` reports `HASH_MISMATCH` or `UNTESTED` for a file.
|
||||
|
||||
**HASH_MISMATCH:**
|
||||
`verify.py` reports `UNTESTED` for a file.
|
||||
|
||||
The file exists and was hashed, but the computed hash doesn't match any expected
|
||||
value. This means you have a different version of the file than what the platform
|
||||
or emulator expects.
|
||||
or emulator expects. The reason field shows the expected vs actual hash prefix.
|
||||
|
||||
To find the correct version, check the system page on the site. It lists every
|
||||
known BIOS file with its expected MD5 and SHA1.
|
||||
@@ -147,10 +145,11 @@ How to read and interpret `verify.py` output.
|
||||
| Status | Meaning |
|
||||
|--------|---------|
|
||||
| `ok` | File present, hash matches (or existence check passed) |
|
||||
| `untested` | File present, hash not confirmed (existence-only platforms) |
|
||||
| `untested` | File present, hash not confirmed against expected value |
|
||||
| `missing` | File not found in the repository |
|
||||
| `hash_mismatch` | File found but hash doesn't match expected value |
|
||||
| `size_mismatch` | File found but size doesn't match what the emulator expects |
|
||||
|
||||
Hash and size mismatches are reported as `untested` with a reason field
|
||||
showing expected vs actual values (e.g., `expected abc123… got def456…`).
|
||||
|
||||
**Reading the output:**
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ Recalbox uses three severity levels derived from two YAML fields (`mandatory` an
|
||||
|-----------|--------------------|--------|-------------------|
|
||||
| true | true | RED | CRITICAL |
|
||||
| true | false | YELLOW | WARNING |
|
||||
| false | (any) | GREEN | INFO |
|
||||
| false | (any) | GREEN | WARNING |
|
||||
|
||||
### checkInsideZip (Batocera zippedFile)
|
||||
|
||||
@@ -93,9 +93,10 @@ If the inner file is not found inside the ZIP, the status is UNTESTED with a rea
|
||||
|
||||
### RomM verification
|
||||
|
||||
RomM checks both file size and hash. It accepts any hash type (MD5, SHA1, or CRC32).
|
||||
ZIP files are not opened; only the container is checked. `verify.py` replicates this
|
||||
by checking size first, then trying each available hash.
|
||||
RomM uses MD5 verification (`verification_mode: md5`). The platform YAML stores
|
||||
SHA1, MD5, and CRC32 for reference, but `verify.py` checks only the MD5 field,
|
||||
matching the platform's runtime behavior. ZIP files are not opened; only the
|
||||
container is checked.
|
||||
|
||||
|
||||
## SHA1 Mode
|
||||
|
||||
Reference in New Issue
Block a user