CD-ROM2 読み込み高速化パッチ

概要

  • Super System Card の CD-ROM data 読み込み処理にパッチをあててロード時間を短くします
  • ROM の hack をします. UGX-01 では使えません. 本物の Super System Card にも使えません.
  • パッチなしで Virtual CD drive speed = fast で問題があったソフトは改善できません

用意するもの

手順

PC 側

  1. ips ファイルをダウンロードし、 ROM image に適用する
  2. ikaebi に適用した ROM image を登録する
  3. ikaebi の imagelist から登録した ROM の icon を ROM+RAM card に変更する

UGX-02 側

  1. 設定で Virtual CD drive speed を fast にする (個別設定も可)
  2. システムカード用の ROM を適用した ROM image にする

速度の比較

  • ↑遅い
  • [全共通] ACK をソフトで制御して読み込む BIOS 処理 (A)
  • [全共通, speed = normal] ACK をハードで制御して読み込む BIOS 処理 (B)
  • [公式BIOS + speed = fast] BIOS 処理 (B)
  • [パッチ済みBIOS + speed = fast] B の命令を最適化したもの (C)
  • [未発表] 以前書いた TAI 命令を使うもの (D, 副作用が多くお蔵入り)
  • ↓早い

補足

  • Virtual CD drive speed = normal の場合は公式システムカードと全く同じ処理(B) をします
  • Virtual CD drive speed の設定内容を読み込むレジスタを独自に追加していますので、Mednafen などのエミュレータでは早くなりません
  • icon の変更は手動でやってください

*1:zlibでの算出方法

MAME についているソフトリストの間違い探し

こちらのリストの管理上、 MAME に付属している hash/pcecd.xml を抽出して csv ファイルを作っている. ここでいくつか間違いがあるので直してみた. やっていると母国語が英語であろう人が書いた日本語の解釈に困ることがある気がしてきた.

基本ルール

  • なぜか抜けている & を足す
  • 体験版や開発流出品は除外する
  • バージョン違いはわたしの目的では気にしないつもりなので1ゲームは1つを割り振る
  • 明らかな間違いは直す
  • 全角英数は半角, SJIS 依存してそうな記号は変える
  • 意味として重複している副題、重要ではないと勝手に判断した副題は消す

修正差分とそれの私の解釈

1,2c1,2
< Jpn	SCD	ADCD3001	A. III A列車で行こうIII ~ A Ressha de Ikou III (Box?)	A. III
< Jpn	ACD,SCD	ADCD4002	アトラスRenaissance Voyager	The Atlas - Renaissance Voyager
---
> Jpn	SCD	ADCD3001	A列車で行こうIII	A. III
> Jpn	ACD,SCD	ADCD4002	THE ATLAS	The Atlas - Renaissance Voyager

ADCD3001: A.III (主題) A列車で行こうIII (副題)なのか、意味の冗長なのかよくわからない. 英語の表記は A. III だけで単純すぎてそれでよいのだろうか.
ADCD4002: タイトル画面では THE ATLAS と書いてあったのでそうした.

27c27
< Jpn	SCD	DWCD2002	ライザンバーII	Rayxanber III
---
> Jpn	SCD	DWCD2002	ライザンバーIII	Rayxanber III
32,38c32,38
< Jpn	SCD	FCCD5003	真・女神転生	Shin Onryou Senki
< Jpn	GECD	GECD-1010	CD Mahjong Bishoujo Chuushinha	CD Mahjong Bishoujo Chuushinha
< Jpn	GECD	GECD-1012	CD Pachisuro Bishoujo Gambler	CD Pachisuro Bishoujo Gambler
< Jpn	GECD	GED-1011	Hi-Leg Fantasy	Hi-Leg Fantasy
< Jpn	GECD	GED-1013	CD Hanafuda Bishoujo Fan Club	CD Hanafuda Bishoujo Fan Club
< Jpn	GECD	GED-1015	AV Tanjou	AV Tanjou
< Jpn	GECD	GED-1016	Bishoujo Janshi Idol Pai	Bishoujo Janshi Idol Pai
---
> Jpn	SCD	FCCD5003	真怨霊戦記	Shin Onryou Senki
> Jpn	GECD	GECD-1010	CD麻雀美少女中心派	CD Mahjong Bishoujo Chuushinha
> Jpn	GECD	GECD-1012	CDパチンコ美少女ギャンブラー	CD Pachisuro Bishoujo Gambler
> Jpn	GECD	GED-1011	ハイレグファンタジー	Hi-Leg Fantasy
> Jpn	GECD	GED-1013	CD花札美少女ファンクラブ	CD Hanafuda Bishoujo Fan Club
> Jpn	GECD	GED-1015	AV誕生	AV Tanjou
> Jpn	GECD	GED-1016	美少女雀士アイドルパイ	Bishoujo Janshi Idol Pai

DWCD2002, FCCD5003: 制作者のコピペミスが予想される
GECD-xxxx: 日本語名をつけた

43c43
< Jpn	CD	HACD9002	サイドアームスペシャル	Hyper Dyne SideArms Special
---
> Jpn	CD	HACD9002	サイドアームスペシャル	SideArms Special

HACD9002: Hyper Dyne を発音することがない気がした.

46,47c46,47
< Jpn	CD	HCD0012 / HCD0011 (w/ audio CD)	うる星やつら STAY WITH YOU	Urusei Yatsura - Stay With You
< Jpn	CD	HCD0013	J. B. ハロルド 殺人クラブ	J. B. Harold Satsujin Club
---
> Jpn	CD	HCD0012	うる星やつら STAY WITH YOU	Urusei Yatsura - Stay With You
> Jpn	CD	HCD0013	J.B.ハロルド殺人クラブ	J. B. Harold Satsujin Club

HCD0012: ゲームのパッケージとしては HCD0012 と HCD0011 で、ゲームディスクは HCD0012 だと思われる. HCD0011 は別途登録すべき.
HCD0013: 殺人を書いてマーダーと呼ぶ記憶があったんだけど保留.

58,59c58,59
< Jpn	SCD	HCD2028	アドベンチャークイズ カプコンワールドハテナの大冒	Adventure Quiz - Capcom World Hatena no Daibouken
< Jpn	CD	HCD2029	ロードス島戦記	Lodoss Tousenki - Record of Lodoss War
---
> Jpn	SCD	HCD2028	アドベンチャークイズ カプコンワールド ハテナの大冒険	Adventure Quiz - Capcom World & Hatena no Daibouken
> Jpn	CD	HCD2029	ロードス島戦記	Lodoss Tou Senki - Record of Lodoss War

HCD2028:冒険が脱字していた. 2 つのゲームの名前の間に & をいれるべきか悩む. パッケージではその間は改行していて1行で書く適切な方法がわからない.
HCD2029: Lodosstou Senki のほうがいいのかもしれない.ロードスが外来語であり、島をくっつけると変に見えて困る.

93c93
< Jpn	SCD	HCD5075	銀河お嬢様伝説ユナ2	Ginga Ojousama Densetsu Yuna II - Eternal Princess
---
> Jpn	SCD	HCD5075	銀河お嬢様伝説ユナ2 -永遠のプリンセス-	Ginga Ojousama Densetsu Yuna II - Eien no Princess
96c96
< Jpn	SCD	HCD5078	銀河お嬢様伝説ユナ HuVIDEO同梱再販版	Ginga Ojousama Densetsu Yuna HuVideo CD
---
> Jpn	SCD	HCD5078	銀河お嬢様伝説ユナ HuVIDEO	Ginga Ojousama Densetsu Yuna HuVideo CD

HCD5075:かなりの混乱事例.タイトル画面に Galaxy Fraulein と書いてあるが、英語とドイツ語が混ざっている. そして漢字も書いてある. サブタイトルはこのリストの慣例を無視して英訳している.優先すべき事項が母国語に依存しすぎる.

98c98
< Jpn	CD	HCD8001	小川範子 No・Ri・Ko	No Ri Ko
---
> Jpn	CD	HCD8001	No・Ri・Ko	No Ri Ko

HCD8001: 商品名は No.Ri.Ko で漢字の名前は副題だと思う. そして意味が重複しているので副題は消した.

104,106c104,106
< Jpn	CD	HCD9008	ぎゅわんぶらあ自己中心派 激闘36雀士 CDだよ全員集合	Gambler Jikochuushinha - Gekitou 36 Janshi
< Jpn	CD	HCD9009	イースI・II	Ys Book I II
< Jpn	SCD	HDC2037	天外魔境 ZIRIA SCDバージョン	Tengai Makyou - Ziria Hibaihin
---
> Jpn	CD	HCD9008	ぎゅわんぶらあ自己中心派 CDだよ全員集合!!激闘36雀士	Gambler Jikochuushinha - CD dayo Gekitou 36 Janshi
> Jpn	CD	HCD9009	イースI・II	Ys I & II
> Jpn	SCD	HCD2037	天外魔境 ZIRIA 非売品	Tengai Makyou - Ziria Hibaihin

HCD9008: 長いし単語の並べ方をタイトル画面をみて直した. でもパッケージと並び順が違う.

113c113
< Jpn	ACD,SCD	HECD4007	ブランディッシ	Brandish
---
> Jpn	ACD,SCD	HECD4007	ブランディッシュ	Brandish

HECD4007: 脱字.

116c116
< Jpn	ACD,SCD	HECD4010	サザン アイズ 3X3EYES ~三只眼燮成~	3x3 Eyes - Sanjiyan Hensei
---
> Jpn	ACD,SCD	HECD4010	3x3EYES ~三只眼燮成~	3x3 Eyes - Sanjiyan Hensei

HECD4010: 3x3 をサザンと読めるのは日本人だけだろうし、この読み方は辞書にのっていない. 一応重複として消したが、英語名を Sazan Eyes にしたほうがよいのでは??

141c141
< Jpn	ACD	HMCD4008	ファイプロ女子憧夢超女大戦 全女vsJWP	Wrestling Universe - Fire Pro Joshi - Dome Choujo Taisen - WOWOW vs. JWP
---
> Jpn	ACD	HMCD4008	ファイプロ女子憧夢超女大戦 全女vsJWP	Fire Pro Joshi Dome Choujo Taisen - Zenjo vs JWP

HMCD4008: 英語名がやたらと長いし Wowow は放送局名なので直しました.

151c151
< Jpn	SCD	ICCD1001	アールタイプ コンプリートCD	R-Type Complete CD
---
> Jpn	SCD	ICCD1001	R-TYPE コンプリートCD	R-Type Complete CD

ICCD1001: R-TYPE をカタカナで書く例は個人的主観で気持ち悪かったのでかえた.

154c154
< Jpn	SCD	ICCD3004	ソルビアンカ	Sol Moonarge
---
> Jpn	SCD	ICCD3004	ソル:モナージュ	Sol Moonarge
164,165c164,165
< Jpn	CD	JCCD0003	ジャックニクラウス・チャンピオンシップ・ゴルフ	Jack Nicklaus World Tour Golf
< Jpn	CD	JCCD0601	ウルトラボックス創刊号	Ultrabox Sohkan Gou
---
> Jpn	CD	JCCD0003	ジャックニクラウス・ワールド・ゴルフ・ツアー	Jack Nicklaus World Golf Tour
> Jpn	CD	JCCD0601	ウルトラBOX創刊号	Ultrabox Sohkan Gou

ICCD3004: たぶんコピペミス
JCCD0003: 日本語名はHuCard のほうの名前からコピペしたらしい.英語の名前はパッケージはその順番であってるが、英訳としてはダメだと思う.
JCCD0601: ほかのシリーズがBOXで統一していたのでそれにした.

175c175
< Jpn	SCD	JCCD2010	ダンジジョンマスター セエロンズ・クエスト	Dungeon Master - Theron's Quest
---
> Jpn	SCD	JCCD2010	ダンジョンマスター セロンズ・クエスト	Dungeon Master - Theron's Quest
190c190
< Jpn	SCD	KMCD2002	スナッチャー・シーディロマンティック	Snatcher
---
> Jpn	SCD	KMCD2002	スナッチャー・シーディロマンティック	Snatcher CDROMANTIC

JCDD2010: ダンジョンは誤字. ナレーションではセロンズといっているのでそっちにした.
KMCD2002: 作った人は CDROMANTIC を抜いたのは深い理由がありそうな気がする.

198c198
< Jpn	SCD	KOCD3005	信長の野望・全国版	Nobunaga no Yabou - Zenkokuban
---
> Jpn	SCD	KOCD3005	信長の野望 全国版	Nobunaga no Yabou - Zenkokuban
205c205
< Jpn	SCD	MCCD1003	キャンペーン版大戦略II	Daisenryaku II - Campaign Version
---
> Jpn	SCD	MCCD1003	キャンペーン版大戦略II	Campaign Ban Daisenryaku II
207c207
< Jpn	SCD	MCCD4005	フレイCD -サーク外伝-	Fray CD Xak Gaiden
---
> Jpn	SCD	MCCD4005	フレイCD -サーク外伝-	Fray CD - Xak Gaiden

KOCD3005: 続編に書き方を合わせた
MCCD1003: キャンペーンを先につける方が正しいらしい
MCCD4005: 英語名副題の前に - をつけた

210c210
< Jpn	SCD	MRCD2001	テクモ ワールドカップスーパーサッカー	Tecmo World Cup Super Soccer
---
> Jpn	SCD	MRCD2001	テクモワールドカップスーパーサッカー	Tecmo World Cup Super Soccer
212,213c212,213
< Jpn	SCD	MWCD2001	ザ・キックボクシング	The Kick Boxing
< Jpn	SCD	MWCD2002	ザ・デビスカップテニス	The Davis Cup Tennis
---
> Jpn	SCD	MWCD2001	ザ・キックボクシング	The Kick Boxing
> Jpn	SCD	MWCD2002	ザ・デビスカップテニス	The Davis Cup Tennis

この3つは記号とスペースの振り方の変更だけ.

235,237c234,236
< Jpn	SCD	NAPR-1034	キャルツー	Cal II
< Jpn	SCD	NAPR-1035	ドラゴンナイト3	Dragon Knight III
< Jpn	SCD	NAPR-1036	グラデュエーション 卒業 Graduation	Sotsugyou - Graduation
---
> Jpn	SCD	NAPR-1034	CALII	Cal II
> Jpn	SCD	NAPR-1035	ドラゴンナイトIII	Dragon Knight III
> Jpn	SCD	NAPR-1036	卒業 -Graduation-	Sotsugyou - Graduation
240,241c239,240
< Jpn	SCD	NAPR-1039	キャルIII 完結編	Cal III
< Jpn	SCD	NAPR-1040	クイズアベニュー3	Quiz Avenue III
---
> Jpn	SCD	NAPR-1039	CALIII 完結編	Cal III - Kanketsu Hen
> Jpn	SCD	NAPR-1040	クイズアベニューIII	Quiz Avenue III
244c243
< Jpn	ACD,SCD	NAPR1043	誕生~デビュー~	Tanjou Debut
---
> Jpn	ACD,SCD	NAPR1043	誕生 -デビュー-	Tanjou - Debut

NAPR-1034: 自分がCAL のほうが自然に感じた.
NAPR-1035: タイトル画面のローマ数字にした
NAPR-1036: こういう単純な翻訳併記は副題として冗長な気もするが消さなかった.
NAPR-1039,NAPR-1043:その前の3つ理由とだいたい同じ.

251c250
< Jpn	SCD	NAPR-1050	スペースインベーダー・ジ・オリジナルゲーム	Space Invaders - The Original Game
---
> Jpn	SCD	NAPR-1050	スペースインベーダー The Original Game	Space Invaders - The Original Game

NAPR-1035: カタカナが長い.

254c253
< Jpn	CD,SCD	NBCD1001	まーじゃん バニラシンドローム	Bunilla Syndrome Mahjong
---
> Jpn	CD,SCD	NBCD1001	まーじゃん バニラシンドローム	Mahjong Bunilla Syndrome

NBCD1001: 英語表記の単語の順番が変.

261c260
< Jpn	SCD	NBCD5008	スロット勝負師	Slot Shoubushi
---
> Jpn	SCD	NBCD5008	スロット勝負師	Slot Gambler
267c266
< Jpn	CD	NSCD0003	サイバーシティ オーエド 808 獣の属性	Cyber City OEDO 808
---
> Jpn	CD	NSCD0003	サイバーシティ オーエド 808 獣の属性	Cyber City OEDO 808 - Kenono no Alignment

NBCD5008: 漢字に「ぎゃんぶらー」てふりがながふってあった.
NSCD0003: パッケージの属性に「アラインメント」てふりがながふってあった.

271c270
< Jpn	CD,SCD	NSCD2007	ロードオブウォーズ	Choujikuu Yousai Macross 2036
---
> Jpn	CD,SCD	NSCD2007	超時空要塞マクロス -2036-	Choujikuu Yousai Macross 2036
276c275
< Jpn	SCD	NSCD2014	超時空要塞マクロス -永遠のラヴソング-	Choujikuu Yousai Macross Eien no Love Song
---
> Jpn	SCD	NSCD2014	超時空要塞マクロス -永遠のラヴソング-	Choujikuu Yousai Macross - Eien no Love Song

NSCD2007: ひどいコピペミス.
NSCD2014: 副題記号を付加

280c279
< Jpn	SCD	NSCD5018	愛・超兄貴	Ai Chou Aniki
---
> Jpn	SCD	NSCD5018	愛・超兄貴	Ai Chou Aniki
282c281
< Jpn	CD	NXCD0002	三国志 英傑天下に臨む/監修:横山光輝	Sangokushi Eiketsu - Tenka ni Nozomu
---
> Jpn	CD	NXCD0002	三国志 英傑天下に臨む	Sangokushi -Eiketsu Tenka ni Nozomu 
288c287
< Jpn	CD	NXCD2009	横山光輝 真・三国志 ?天下は我に?	Shin Sangokushi - Tenka ha Ware ni
---
> Jpn	CD	NXCD2009	横山光輝 真・三国志 ?天下は我に?	Yokoyama Mitsuteru Shin Sangokushi - Tenka ha Ware ni

NXCD0002: 監修は主題でも副題でもない気がするので消した
NXCD2009: この作者の三国志の漫画の設定だろうからいると思って英語名に足した. この2つの関係は気持ち悪い.

290c289
< Jpn	SCD	NXCD2011	ウィザードリィーV	Wizardry V - Heart of the Maelstrom
---
> Jpn	SCD	NXCD2011	ウィザードリィV	Wizardry V - Heart of the Maelstrom

NXCD2011: 末尾のーはファミコンのやつにはなかった.

295,296c294,295
< Jpn	SCD	NXCD2015	ダウンタウン熱血物語	Downtown Nekketsu Monogatari
< Jpn	SCD	NXCD2016	スーパーリアル麻雀スペシャル ミキ・カスミ・ショウコの思い出	Super Real Mahjong Special - Miki Kasumi Shoko no Omoide
---
> Jpn	SCD	NXCDxxxx	ダウンタウン熱血物語	Downtown Nekketsu Monogatari
> Jpn	SCD	NXCD2016	スーパーリアル麻雀スペシャル ミキ・カスミ・ショウコの思い出より	Super Real Mahjong Special - Miki Kasumi Shoko no Omoide yori

NXCDxxxx: NXCD2015 はダウンタウン熱血行進曲の型番である. 熱血物語の方は生産数が少ないのか本物の写真が簡単にはでてこない. 絵柄が違う偽物が横行していて悲しい気分になった. (追記 NXCD3019 が正解とのことです)
NXCD2016: パッケージには「思い出より」と書いてあるがタイトル画面では「想いで」と書いてあるのでどちらがいいのかわからない.

312c311
< Jpn	CD	NXCD9001	北斗星の女 西村京太郎	Nishimura Kyoutarou Mystery - Hokutosei no Onna
---
> Jpn	CD	NXCD9001	西村京太郎ミステリー 北斗星の女	Nishimura Kyoutarou Mystery - Hokutosei no Onna

NXCD9001:主題と副題がどちらかわからない.

317c316
< Jpn	CD	PVCD-2005	マインスウィーパー	Mine Sweeper
---
> Jpn	CD	PVCD-2005	マインスイーパー	Mine Sweeper
324,325c323,324
< Jpn	SCD	PVCD-4012	メタルエンジェル	Metal Angel II
< Jpn	SCD	PVCD-5013	熱血レジェンド ベースボーラー	Nekketsu Legend Baseball
---
> Jpn	SCD	PVCD-4012	メタルエンジェル2	Metal Angel II
> Jpn	SCD	PVCD-5013	熱血レジェンド ベースボーラー	Nekketsu Legend Baseballer

PVCD-4012: コピペミス
PVCD-5013: Baseballer という表記を英語がはなせる人にとって拒否された気がした.

338c337
< Jpn	ACD,SCD	RHCD-4009	卒業2	Sotsugyou II - Neo Generation
---
> Jpn	ACD,SCD	RHCD-4009	卒業2 Neo generation	Sotsugyou II - Neo Generation
342,343c341,342
< Jpn	SCD	RSCD3004	フラッシュハイダース	Flash Hiders
< Jpn	SCD	RSCD-4005	ザ ティーベィー ショー	The TV Show
---
> Jpn	ACD,SCD	RSCD3004	フラッシュハイダース	Flash Hiders
> Jpn	SCD	RSCD-4005	The TV Show	The TV Show

RSCD3004: Arcade Card をいれると起動後に専用の処理が入る
RSCD-4005: ザ ティーヴィー ショーとは書いてある. こういう併記型は判断に困る.

352c351
< Jpn	CD	SSCD0001	ザ・キックボクシング	The Manhole
---
> Jpn	CD	SSCD0001	ザ・マンホール	The Manhole
356,357c355,356
< Jpn	SCD	SXCD2001	ヤワラ	Yawara!
< Jpn	SCD	SXCD4002	ヤワラ!2	Yawara! II
---
> Jpn	SCD	SXCD2001	Yawara!	Yawara!
> Jpn	SCD	SXCD4002	Yawara!2	Yawara! II

SSCD0001: コピペミス
SXCD2001, SXCD4002: カタカナ表記を優先する場面はなかったのでカタカナを消した.

376,377c375,376
< Jpn	CD	TJCD0013	デコボコ伝説 走るワガマンマー	Dekoboko Densetsu - Hashire Wagamanma
< Jpn	CD	TJCD1014	エグザイル 時の狭間に	Exile - Toki no Hasama he
---
> Jpn	CD	TJCD0013	デコボコ伝説 走るワガマンマー	Dekoboko Densetsu - Hashiru Wagamanma
> Jpn	CD	TJCD1014	エグザイル 時の狭間へ	Exile - Toki no Hasama he

TJCD1014: 転記ミス.文法としてはへでもにでも間違っていない.

397,398c396,397
< Jpn	CD	TJCD3034	レーザーソフト ビジュアル コレクション ヴァリス コズミック・ファンタジー ビジュアル集	Laser Soft Visual Collection Volume I - Cosmic Fantasy Visual Shuu
< Jpn	CD	TJCD3035	レーザーソフト ビジュアル ヴァリスビジュアル集	Laser Soft Visual Collection Volume II - Valis Visual Shuu
---
> Jpn	CD	TJCD3034	レーザーソフトビジュアルコレクション コズミック・ファンタジー ビジュアル集	Laser Soft Visual Collection Volume I - Cosmic Fantasy Visual Shuu
> Jpn	CD	TJCD3035	レーザーソフトビジュアル ヴァリス ビジュアル集	Laser Soft Visual Collection Volume II - Valis Visual Shuu
400,402c399,401

TJCD3034: コピペミス.両方とも長い名前で困る.

< Jpn	SCD	TJCD4038	コズミックファンタジー4 ~銀河少年伝説~ -激闘篇-	Cosmic Fantasy IV - Ginga Shounen Densetsu Totsunyuu Hen
< Jpn	SCD	TJCD4040	コズミックファンタジー4 ~銀河少年伝説~ -突入篇-	Cosmic Fantasy IV - Ginga Shounen Densetsu Gekitou Hen
< Jpn	CD	TJCD9001	ヴァリスII THE FANTASM SOLDIER	Valis II - The Fantasm Soldier
---
> Jpn	SCD	TJCD4038	コズミックファンタジー4 ~銀河少年伝説~ -激闘篇-	Cosmic Fantasy IV - Ginga Shounen Densetsu Gekitotsu Hen
> Jpn	SCD	TJCD4040	コズミックファンタジー4 ~銀河少年伝説~ -突入篇-	Cosmic Fantasy IV - Ginga Shounen Densetsu Totsunyuu Hen

名前が長い上激突(gekitotsu)と突入(totsunyuu)の単語の読みが入れ替わっている,型番はどちらが正しいのかわからない.

CD-ROM 高速転送機能の開発断念

ST0 命令の実行結果を EXTBUS から観測できないという理由で断念します.

いままでの経過

  • CD-ROM2 の転送(読み込み)速度を上げただけでも CPU のほうが相対的におそくなるので限界があるというのを以前から知っていました.
  • そこで CD-ROM2 の data port を独自に拡張した上で TAI 命令で高速転送するという方法を思いつき、実際に早く転送できることを確認しました.
  • しかし、TAI 命令実行途中に割り込みを受けつけないので結構な数のソフトで動作がおかしくなることが判明しました.

実装内容

  • BIOS を hack します.
  • address 0x1ff809 を address 0x1ff808 の mirror とします.
  • TAI 命令の引数は定数のため stack 上に命令を生成します.
port_mirror_enable	equ	$1805

tai_start:
;l <- y.x
;l = length >= 0x800 ? 0x800 : length;
	ldx	$f8
	ldy	$f9
	cpy	#$08
	bcc	set_tai
	clx
	ldy	#$08
set_tai:
;push instructions "tai $1808,dest,length; rts;" on the stack
	lda	#$60 ;rts
	pha
	phy	;length
	phx
	lda	$fb ;dest
	pha
	lda	$fa
	pha
	lda	#$18 ;src
	pha
	lda	#$08
	pha
	lda	#$f3 ;tai
	pha
;push return address for rts
rp eval	rts_position-1
	lda	#rp>>8
	pha
	lda	#rp & $ff
	pha
;push return address for generated instructions
	lda	#$21
	pha
	txa
	tsx
 rept 3
	inx
 endm
	phx
	tax
;enable $1809 as $1808 mirror port
	lda	#$ee
	sta	port_mirror_enable
;execute generated instructions
;*note* 6280 doesn't accept any interrupts for extended periods of time when Txx block transfer is executed. Many games display glitches in the scroll registers.
;*1 maxium 17+0x800*6 cpu clocks -> 27.0 scanlines -> 1.7 ms 
	rts
rts_position
;restrore the S
 rept 1+2*3+1
	pla
 endm
;dest += l;
	clc
	txa
	adc	$fa
	sta	$fa
	tya
	adc	$fb
	sta	$fb
;length -= l; -> length += l ^ 0xffff + 1;
	sec
	txa ;C is not changed
	eor	#$ff ;C is not changed
	adc	$f8
	sta	$f8
	tya ;C is not changed
	eor	#$ff
	adc	$f9
	sta	$f9
;length == 0
	ora	$f8
	beq	to_eab5
	jmp	lea79
to_eab5:
	stz	port_mirror_enable
	jmp	leab5

分岐のための割り込みの検出

割り込みがある場合は mirror port を使わないそこそこ早くしたルーチンを使うことにしました. その割り込みの検出は下記としました.

  • CPU の status flag をみる, php; pla で簡単に見れる
    • 現実として CPU へ直接割り込みを止めることはないらしい
  • VDC の割り込み許可フラグを見る
    • VDC 内部レジスタアドレス 5 の data bit 3:0 が該当する
    • ここを見張ればなんとかなるだろう
    • 作ってみたところなぜかうまくいかない

st0/st1/st2 命令

CPU から VDCレジスタを操作する場合は address 0x1fe00x を利用します. 変数の場合は sta >$000x を利用し、定数の場合は st[012] #xx を利用すると便利です.

  • st[axy] や block 転送命令で >$000x を指定する場合は MPR を経由して address 0x1fe00x が出力されて、 CE7 も L になります.
  • st[012] の場合は MPR を経由しないらしく、有効な address bus は bit1:0, CE7# は L になります. VDC に配線されない address bus は不定です!
    • CE7# は 6280 (CPU) から 6270 (VDC) を操作する専用の線です.

実際の波形です. 実行は sta >$0003; st0 #2 です.
f:id:na6ko:20190512110435p:plain

これは Ki さんの計測結果からもわかります.
https://kikb.web.fc2.com/HuC6280_CPU/HuC6280_CpuLog_IMM/OPC_03_ST0_IMM_2byte_4cycle.txt

今後

mirror port 周りの実装はすべて削除いたします. そこそこ早くしたルーチンは使えますので物理的な未改造ではこれが限界です.

Namco 340 を使ってるファミカセ基板の flash 化

ファミスタハッカーの方からご依頼を受けて作りました. 163 とは異なりかなり単純化されているので改造作業の難易度は普通です. ただし改造できる基板の入手難易度は高いです.

配線

基板の型番は CS 0003 で違うものは via の位置が異なる可能性が高いです.
f:id:na6ko:20190318111220j:plainf:id:na6ko:20190318111215j:plain

[Program Flash Memory]
A18 = fixed (5V か GND で固定する)
A17 = 340.ProgramROM.A17 (ピン番号8)
A16 = 340.ProgramROM.A16 = Mask ROM ピン番号 22
A15:0 = Mask ROM から変更なし
D7:0 = Mask ROM から変更なし
CE# = cardedge.CPU.ROMSEL# = 340.CPU.ROMSEL# = そこらへんの via からとる
WE# = cardedge.CPU.R/W = (同上の流れ)
OE# = 340.ProgramROM.EN# = Mask ROM ピン番号 20

[Character Flash Memory]
A18 = fixed
A17 = 340.CharacterROM.A17 (ピン番号45)
A16 = 340.CharacterROM.A16 = Mask ROM ピン番号 22
A15:0 = Mask ROM から変更なし
D7:0 = Mask ROM から変更なし
CE# = cardedge.PPU.A13 = 340.PPU.A13 = via は ROM の下でとれませんでした
OE# = cardedge.PPU.RD# = 340.PPU.RD# = そこらへんの via からとる
WE# = cardedge.PPU.WR#

補足

  • 両方の ROM とも A18 はあるみたいですが、実際に使う場面がなさそうなのと自分が2011年に確認した分には不確定だったのでなしにしました.
  • いまもガバガバなんですけど anago からでてくる昔書いた英語の文法がもっとガバガバで恥ずかしいです.
  • 163 使用基板の flash 化の改造記事を今見たら狂気じみていて頭がおかしいです. 163 系の基板と仕様のバリエーションも豊富で混乱します.
  • 340 (175) のソフトは多いので flash cartridge を作る価値はアリだと思いました.
  • script は 163 向けと同じです. (ROM に関しては大体一緒)

CD-ROM2 の読み込み時間の厳密な再現の必要性 / その4

前回 ADPCM memory controller の改修でシャーロックホームズの探偵講座が動くようになりました. しかし内部の動画の再生で読み込みが早くてそれの調整をしていました. こういう調整は特定のソフトにだけ専用のその場しのぎのパラメータを振ることで短期的に解決できますし、ゲームを遊びたいだけの人は高い再現性と誤解してくれます*1. 当プロジェクトは闇の部分をなくすようにしております.

話がそれました. この手の同期をとらないプログラムは読み込み時間の精度をあげねばなりません. シャーロックホームズがちゃんと動いても HuVideo がちゃんと動かないので原因を調べていたら至近距離の seek time の計算値が間違っていることに気づきました. シーケンシャルアクセスの続き扱いの read command なので seek time ではなく setup time の名前が適切ですが、処理上は seek time と呼びます.

ここまでくると"CD-ROM2 の読み込み時間の厳密な再現の必要性 / その3"で調整した値は意味がないものになってしまいます. 先述の動画系ソフトに合わせて ADPCM 再生と書き込みの同期をとらない F1チームシミュレーション PROJECT.F とブランディッシュもやり直しとなってしまいます.

*1: (暗黙的パッチ当てまくりのエミュレータ名)では正しく動くのですけどといわれると説明するのに困ります

ADPCM memory controler の改修

前回 ADPCMfifo の深さが 0x400 word ありましたが、他の fifo と比べて更新頻度がとても遅いので fifo の深さを 0 M4K で最小の深さの 4 word にしました.

4 word にしたところで dead lock している場所が見つかったので直しました(厳密には知っていたけど問題ではないと思い込んでいたので放置してた). 先日シャーロックホームズの探偵講座を解析したら別の場所での dead lock がかかっていたのでそれを直したら、放置状態となっていた複数のソフトの問題も改善いたしました.

EP2C5 は前回から 1 M4K 減りましたので subchannel 用 fifo も割り当てられそうです. 去年ちょっとやってみようとしたのですが、 BIOS の挙動がよくわからず解析したいのに subchannel fifo をサポートしてる mednafen のデバッガが使いづらくてよくわかりませんでした. これはあとで考えます.

ADPCM memory controller の仕様

かなりの試行錯誤がありましたがようやく完成した気がしますので現在の実装の仕様を書いておきます.

基本的なこと - 理論

UperGrafx はエミュレータと異なり大半をハードウェアで実装しております. ソフトのエミュレータの場合、仮想的に時間を止めて共有RAMを自由に操作できるのですが、時間を止められないハードウェアの場合は優先度を決めたりバッファにため込んで処理をする必要があります.

このためソフトウェアエミュレータソースコードは私が読んで資料にはなりますが、それを手直ししてコンパイルしてハードウェアにあてるというのは根本的に原理が違いますのでできません. だから開発に手間と時間がかかっております.

基本的なこと - データの流れ

下記の流れです.

  • 前段の入力 CD-ROM fifo と 6280 からの data を受け取り、 ADPCM 用 RAM へ書き込む
  • 後段への出力は 6280 と MSM5205 (decoder) の2つあります.
    • 6280 は ADPCM 用 RAM を読みに行きます.
    • MSM5205 は再生時に定期的にデータを読みに行きます.
  • これらの処理は優先度を決めますが、基本的にすべての処理要求を完了する必要があります.

処理要求

各方面からの要求は複数あります.

  • 6280
    • RESET
    • voice decoder play request (play)
    • length register latch
    • read address register latch
    • write address register latch
    • read data to 6280 (write)
    • write data from 6280 (read)
  • CD-ROM fifo
    • write data by DMA (write)
  • MSM5205
    • read data by decoder (play, read)

memory controller が動いているときも 6280 の要求はとりこぼさないように内部のレジスタで状態を管理する必要があります. idle 状態になったとき上記の 9 通りの処理要求に優先度をつけて順番に処理します. 優先度は下記となっております.

  • RESET
  • play 中で decoder 行き fifo が full ではないとき
    • fifo への書き込み (READ)
  • DMA 転送 が有効で CD-ROM fifo が empty ではないとき
    • RAM への書き込み (WRITE)
  • READ address の更新
  • WRITE address の更新
  • 6280 からの読みこみ (READ)
  • 6280 からの書き込み (WRITE)

memory 転送途中でも制御レジスタと入出力先の fifo の状態で処理を中断する必要があります.

  • RESET
  • PLAY register = 0
  • PLAY ための READ
    • decoder 行き fifo が full になる (4 word になったのでこの時間は短い)
  • DMA WRITE
    • play 途中に decoder 行き fifo が empty になる
    • CD-ROM fifo が empty になる
  • (6280 からの読み書きは 1 byte ですぐおわるので中断しません)

READ と WRITE は RAM を読み書きする間, PLAY は decoder が有効な間は 1 になりまして、status register に反映が必要です. READ と WRITE は(私の実装では) 同時に 1 になりませんが、 READ と PLAY, WRITE と PLAY は同時に 1 になります.

address register と length register

read address register は play と read で RAM を読み込んだときに byte 単位で increment します. address 0xffff の次は 0x0000 になります. length register は RAM を読み込んだときにbyte 単位で decrement します. address 0x0000 の次は 0x0000 のままです.

write address register と length register は write で RAM を書き込んだときに byte 単位で incrementします. address 0xffff の次は 0x0000 です. length register は 0xffff の場合は更新せずに 0xffff のままです.

ADPCM memory controller からの IRQ2 は細かい部分ははしょりますが下記となります.

  • 再生全部完了: length register == 0 && decoder 行き fifo.empty == 0
  • 再生半分完了は play & ~(length register bit 15)

特記事項

標準の BIOS を利用せずに CD ソフト側でレジスタを操作することがあります. こういう場合 CD ソフト側の出来がヒドイ*1 での制御手順が BIOS と異なる傾向がありますが無難に処理をやりきる必要があります.

シャーロックホームズの探偵講座では下記の対応が必要です.

  • 再生途中に address register や length register を更新しようとするのでできるだけ早めに更新する必要があります.
  • 6280 からの読み書きには完了フラグがありますが、書き込み完了フラグは無視しているのでデータはできるだけ書き込む必要があります.
    • 実機ではある程度取りこぼしている気がする
    • エミュレータでは取りこぼしてないようだ
    • UperGrafx では処理を間に合わせたので取りこぼしはないとおもう

*1:遊んで名作とか信頼できるメーカーとか関係ないです

EP2C5の内部資源削減おわり

sound_mixer

618 lc, 4 M4K -> 456 lc,3 M4K (注:sound_mixer の外に移動したものもあるので単純比較しづらい)

  • sound mixer は sound clock 側の処理を cpu clock 側での移動をしました. これによって cpu clock 側から sound clock 側へ制御データを渡す必要がなくなり dual clock fifo (浅いので 0 M4K) の削除をしました.
  • ADPCM 専用 fifo と CDDA 専用 fifo はともに dual clock でしたが single clock になり, CDDA 専用 fifo は CD-ROM fifo と兼用になりました.
  • cpu clock から sound clock への fifoADPCM と CDDA を加算していましたが、 0 M4K の浅い fifo で 17 bit 渡すよりかは浅くても 1 M4K の 25 bit にして 2 音源を加算するのは sound clock 側にしました. これにより 24bit 符号あり clipping 加算回路が1つ減りました. (なお加算回路が1個減っても雀の涙)
  • fadeout contoller は計算したところ更新のため時間精度をそこまでだす必要がなさそうなので精度を落としました.

sound_mixer.msm5205 (外)

msm5205 へ入力する更新頻度のための分周用定数テーブルは 16 word 10 + 3 +3 bit となっておりましたが. 16 word 1 + 3 + 3 bit に削減しました. この 10 bit の値は下記の式で計算してました.

(44.1 * 10 ** 3 * 128) / 9.214*10**6 / n 
n = 1 から 16

細かい近似の部分の説明は省略しますが、 n = 16 の値だけを算出しレジスタに書かれる n は param 回ループを回すと param/16 倍となり 10 bit の計算結果はいりません.
これでも 40 lc 程度削りました. (雀の涙)

sound_mixer.msm5205 (内)

2 M4K -> 1 M4K
PCM の値を更新する定数テーブルがありまして、 address 49 * 8 words, data 12 bit の ROM が必要でした. 計算は mame のコードを手直ししたものが下記になります.

/* loop over all possible steps */
for (step = 0; step <= 48; step++) {
	/* compute the step value */
	int nib;
	int stepval = floor (16.0 * pow (11.0 / 10.0, (double)step));

	/* loop over all nibbles and compute the difference */
	for (nib = 0; nib < 16; nib++) {
		int16_t v = 0;
		if(nib & 4){
			v += stepval;
		}
		stapval >>= 1;
		if(nib & 2){
			v += stepval;
		}
		stapval >>= 1;
		if(nib & 1){
			v += stepval;
		}
		stapval >>= 1;
		v += stepval;
		if(nib & 8){
			v *= -1;
		}
		voice->diff_lookup[(step<<4) + nib] = v;
	}
}

nib の bit3 は 1 倍か -1 倍なので動的に計算します. nib の bit2:0 は乗算ぽいのですが右シフト演算が入るので乗算ではないです. ためしに乗算に置き換えてみたら voice はちゃんとでませんでした.

この式通りにハードウェアで加算する場合 fllor() の演算結果を 49 word x 12 bit の table にするので先述のように単純に ROM にすると 2 M4K も食います.

計算結果を眺めていたら 1/3 ぐらいは上位ビットが 0 で埋まっているのに気づきました. ROM の data width は 9 bit なので address に応じて有効な data bit 数を 6, 9, 12 にわけまして, 6 bit の領域の上位に 12 bit の bit11:9 を埋めるなどで詰めていったら 9bit x 512 word の 1 M4K に収まりました.

単純な ROM とは違いますが定数テーブルや加算回路がなくなりまして MSM5205 の回路使用量は半分になりました. (なお雀の涙)

videotomcu:vtom

1 M4K -> 0 M4K
使用していたのは 2bit で深さ 4 word だけでしたので logic cell にしました.
その代わりに audio_mixer の音声データ fifo に 1 M4K を割り当てました.

pce_bridge_cpu_vce.colorram

2 M4K -> 1 M4K
単純に無駄だったので減らしました.

終わり

  • audio_mixer のソースはかなりきれいになりました. 正直な感想は回路数は大して減ってないのがつらいです.
  • これらの作業により 3 M4K を捻出できましたので、 FIFO の深さを 0x800 byte, 4 M4K にすることができます.
  • なんで 2019年に EP2C5 にマジになっているのか、設計時点で EP2C5 を選んだことをすごく後悔しました.

MSM5205 のデコードの部分は処理速度を求めるわけでもないので、MCU に処理させても良さそうです. ソフトならこんなに無理して定数テーブル削るなんてやる必要ないですから. 構造的にはハードで転送をしているのでそこだけソフトでやるのはすごく手間なんでやりませんが、1から作り直すならエミュレータでいいかなと思いました.