Mingw系のgccで生成される exe ファイルの main() の argv の文字コード

タイトルが長い...
筆者は msys2 を常用し開発作業をしています. 昨日コマンドラインの引数 (main() の argv) にUTF-8の日本語文字列を渡しても正常に動かないケースがあり原因を調べました. そもそも日本語文字列をターミナルで使うということが10年間ぐらいなくてなんでいまさらと、いう話ですけど.

経緯

  • > echo.exe "お尻"
  • > hoge.exe "お尻"
  • main() の argv を調べたらなぜか SJIS になっている
  • shell の locale は関係ない
  • cmd.exe からでも関係ないし、その文字コードも関係ない

調べた

文字コードのことはかいてないのですが、Win32 ネイティブだとパス引数が変換され、互換レイヤだとパス引数が変換されないとあります. また「MSYSのコマンド群はPOSIX互換レイヤで動いています」と書かれているので echo は UTF-8 をいれても UTF-8 がでる理由もつじつまが合います.
http://7shi.hateblo.jp/entry/2012/05/05/220750

このパス引数の変換は /c/windows を c:/windows に変換してくれるというもので、msys2 の shell からは使う身としては大変便利だと思っています. しかしこれが誤動作して困るという記述は世界中にあります.

UTF-8 の文字列を SJIS に勝手に変換するのはコマンド実行から main() 実行の間にパス変換のついでに行われる根拠を見つけることはできませんでした. また変換先が SJIS になるというのも日本語設定の Windows を使っているからのはずで、別の言語だとまた別の文字コードに変換されるのかなど謎が多いです.

対策

そこにあるように msys 互換レイヤとか cygwin を使うなど exe の作成過程をかえることによって直せるものだと思われます. 本当のところはネイティブの exe リンク時に設定を変えられるのが最適なのですけど.

今回の機能は私だけがデバッグに必要なもので、仕方なく iconv を利用して変換された SJIS を main() の最初に UTF-8 に戻すということで回避しました.

高解像対応をやりたいその3

1080p を対応した後に整数を可変に循環させて平均として小数倍をだすというアイディアを教えてもらったので実装しました. 理想的な pixel aspect ratio にそしてある程度近づけることができました. *1

各種欠点は消せてませんが下記の2解像度でそれぞれ2種類の pixel aspect ratio をだすことにしています.

      |div2       |div3       |div4
理想値|0.583  --- |0.875  --- |1.167  ---
720pA |0.667 1.143|1.000 1.143|1.333 1.143
720pB | ---   --- |0.875 1.000|1.167 1.000
1080pA|0.625 1.071|1.000 1.143|1.250 1.071
1080pB|0.588 1.008|0.941 1.076|1.176 1.008

* 720pB.div2 は正常に絵が出ない. 設計ミスと性能の限界で直せない.

  • divN = vce dotlock = pce master clock / N
  • 1つ目の値: pixel aspect ratio
  • 2つ目の値: 理想との比率(倍率, 理想値 / 1つ目の値)

pixel aspect ratio の計算方法

      |vertical   |horizonal.2|horizonal.3        |horizonal.4
720pA |3          |2          |3                  |4
720pB |3          |(1+2+2+2)/4|(2+3+2+3+2+3+3+3)/8|(3+4)/2
1080pA|4          |(2+3)/2    |4                  |5
1080pB|(4+4+4+5)/4|(2+3)/2    |4                  |5

理想値は256x224 pixel の領域を 4:3 という仮定*2で下記の計算する.
224/3*N/256

切り替え可能

720p の A と B, 1080p の A と B は設定メニューで切り替えができます.
この都合で pixel aspect ratio on 4x3 での 3x3 は廃止にします.

*1:もちろん平均として小数倍なので、スクロール時の波打ちなどの違和感はあります.

*2:CRTでは横幅をユーザーが調節できるので仮定

高解像度対応をやりたいその2

複数の解像度用のパラメータを切り替える仕組みを事前につくり、実験をしてみました. 実験内容はゲーム画面ではなく単純なテストパターンをだすだけです.

結果は 1600x1200 が映らない以外はわりと良好でした. 4:3 の画面でも音声の転送は(なぜか)うまくできていました. 1600x1200 が映らない理由は LCD 側の out of range だと思われますが、pixel clock が 162 MHz, TMDS encoding 後は10倍の 1.6 GHz になりますのでタイミング違反の可能性もあります.

気になる点: LCD 側の横引き延ばし設定

手元にある2つのモニタでは 4:3 の画面は横に引き延ばされてしまったので引き延ばしなしの設定 4:3 へ変えました. その後 16:9 の画面を写したところ今度は 4:3 を維持して 16:9 の画面を横に縮められてしまいました. 2つともです.

他のモニタでは引き延ばしをやめるだけにできた記憶があるんですが... 手動でこの設定を毎回やるのはふざけていると思いました.

気になる点: dotclock = master clock / 2 mode

縦に4倍に伸ばす場合にpixel aspect ratio は 3:4 (0.75) にするつもりでしたが、これは 2:3 (0.67) より大きくなりまして、画面に収まりません.

このモードは縦4倍モードでは対応しないつもりです.

内部処理を考えていたのですが 720p mode と比べて矛盾点が増えすぎていること、使っているソフトが少ないこと(知っている限り3本ぐらい)、真剣に対応すると時間がかかることが理由です.

気になる点: 1280x960 mode

実装をある程度やるつもりですが計算上やはり横幅が足りていないのが気になります. pixel aspect ratio 5:4 の場合は 256 pixel の場合は確かに画面に収まるのですがその左右にある backdrop 領域がまったくでません.
pixel aspect ratio 4:4 の場合は画面に収まらないのでいまのイメージ選択画面の左端のカーソルも表示されないと思われます.

ただし縦に余白が出ないことと、 pixel clock が 720p の次に遅いのも開発者としては利点と考えております.

高解像度対応をやりたいその1

UperGrafx プロジェクトは 10月18日から20日に米国オレゴン州ポートランドで開催される Portland Video Game Expo に間借りして出展する予定です. → https://www.retrogamingexpo.com/
出展準備があまり進んでおらず出展内容は UGX-01/UGX-02 での高解像度対応をするつもりです. 理由は短時間で準備ができそうだからです.

高解像度対応の意義

720p では PCE の画面がすこし横に長い欠点があり、これを補いたいというのが目的です. こういったレトロゲーム機の映像は画質や応答速度ではアナログの CRT が最高なのは事実です. 一方 CRT の入手や維持が困難だったり、体積や重量が大きいというのも事実です.
こういった中ディジタル映像化を進めるには複数の要素をよくさせることはできますがいくつかの要素を犠牲にする必要があると開発者は考えております.

ドットバイドット

開発者はドットを整数倍で表示することを最優先にしております. 小数倍も理論上できるのですがアナログを介せばできることで、その欠点は英語で Jailbar と呼ばれているそうです. 整数倍である以上闇雲に解像度をあげてもよくなるということではありません.

720p の解像度は PCE 特有の 1 pixel の横幅を可変にできる仕様に対して下記の利点があります.

  • どの LCD でも対応している
  • 音声を TMDS によって転送できる
  • pixel clock が早くないので設計がわりと楽
  • scanline の本数が 240 の 3 の整数倍
  • 1365 master clock / scanline から 2,3,4 で除算して PCE の dotclock をだすことと表示の整数倍に矛盾が少ない.
    • 描画期間中に pixel aspect ratio を変更する2本のソフト(あすか120と竜虎の拳)で自然(だと思う)

欠点は先述の1点のみです.

  • 大半のソフトで使う 1365 / 4 mode のとき 1 pce pixel aspect ratio が 4:3 で横に長い

設計当初は CRT の横の長さはユーザーが決められるので正解はないと勝手に決めて気にしていなかったのですが、絵に詳しいひとから不評です.

縦4倍モード

ここからは 720p より高解像度の説明をいたします. それらの共通事項は下記となります.

1280x960 (screen aspect ratio 4:3)

利点

  • 縦方向は 240 の整数倍でモニターが映れば余白がない

欠点

  • 横方向の解像度が足りない (R-TYPE は 336x240 pixel でその 4x4 倍で 1344x960 pixel の領域が必要)
  • どの LCD でも対応しているのか不安
  • 音声の転送規格がないので調査が必要

1920x1080 (1080p, screen aspect ratio 16:9)

利点

  • 対応している LCD がとても多い
  • 音声を TMDS によって転送できる
  • 横方向の解像度が足りる

欠点

  • 縦方向の解像度が 240 の整数倍ではなく対応に困る
  • pixel clock が 148.5 MHz と結構早いので設計に困りそう

240 の倍数ではない点は縦4倍の場合は 120 line は余白になります. 縦5倍の場合は NTSC の 224 *5 であっても 40 line (PCE で 8 line) 足りません.

縦5倍モード

pixel aspect ratio は 6:5, 5:5, 4:5 になりますがこれは細いと思われます.

1600x1200 (screen aspect ratio 4:3)

利点欠点は 1280x960 と同じで欠点が1つ加わります.
欠点

  • pixel clock 162 MHz として早すぎる

1920x1200 (screen aspect ratio 16:10)

240 * 5 の値かつ、横に余裕があるこれが理想なのかもしれませんが... これは UGX-01, UGX-02 の仕様上、性能不足で動きません. pixel clock が 192.16 MHz となり利用している TMDS encoder IC の限界および DVI の規定の最大値の 165 MHz を超えています.
TMDS として転送できる DVI と HDMI の共通は pixel clock 165 MHz までで DVI なら Dual Channel を選択し, HDMI では上位規格を選ぶ必要があります. また Display Port などの別規格も選択候補となります.

よてい

いろいろ書いてみましたが候補となる3解像度を試してみて本当に使えるのかの確認をします.

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 周りの実装はすべて削除いたします. そこそこ早くしたルーチンは使えますので物理的な未改造ではこれが限界です.