SWF Decompilerメモ

2012年4月18日

フリーではない有料のSWF Decompilerについてメモ。

SWFからFLAを生成するアプリをググると「SWF Decompiler Premium」と「Sothink SWF Decompiler」という製品が出てきます。両方とも購入したのですが、後者の方が断然便利で高機能です。というか、前者のSWF Decompiler PremiumってWindows7だとアプリのウィンドウサイズが変だったりファイル選択がままならなかったりと使い物になりませんでした。

Motion Decompilerは使ったことがないのですが、Sothink SWF Decompilerを日本語化したものだと思います。

萌える

2012年4月17日

どうでもいいネタなんですが、かつて電波新聞社から発行されていた「マイコン」という月刊誌に「マイコンするひと、すきなひと」という、マイコンユーザを紹介するコーナーがあったのですが、1984年4月号を読み返していたところ…

マイコンするひと、すきなひと

「萌えるマイコンギャル」という小見出しがありまして、「萌え」という単語の歴史の古さがちょっとだけ見えたのでした。もっと古くから使われているんじゃないかなと思うのですが、そっち方面の研究家ではないで深入りはしませんヨ。
あ、上記画像の写真と氏名箇所は画像加工したものです。

映像信号を測る / ギャプラス基板

2012年4月10日

JAMMA規格がない頃の基板ですね。

1フレーム分の同期信号がこちら。

ギャプラス基板同期信号

ミスタードリラー2基板との大きな違いは、垂直同期信号が出力されている間は水平同期信号が出ていないということでしょうか。それから同期信号のレベルが基板出力の段階でTTLでHiが+5Vになっています。

垂直同期期間は16.499us~16.5000usでした。周波数にすると60.6060…Hzです。この時期のナムコ基板はこの映像周波数のゲームが多かったようです。

さて、ここまで色々な同期信号をみてきましたが、他に気になる基板は垂直走査周波数が55HzのIREM系でしょうか。表示領域の走査線本数が256本で一般的な240本よりも多めです。ただ、測定するまでもなく、イメージファイトの取扱説明書には映像信号のタイミングが細かく記載されています。
あとは、残念ながら所有していないのですが、映像コンバータを使うと画像がゆがむ事で有名(?)なグラディウスIIの映像信号もいつかはみてみたいですね。

映像信号を測る / ミスタードリラー2基板

2012年4月10日

ミスタードリラー2基板の映像信号をオシロで眺めてみました。古いゲーム基板は、最近の液晶モニタだと映らないとか各種コンバータを通すと映像がおかしくなるとか録画できないとか言われるように、基板によって映像信号が異なります。電圧レベルだけでなく同期期間もバラバラなのですが、一昔前のブラウン管モニタ側も厳密ではない映像信号をそれなりに表示してくれましたし、モニタ側で表示状態を調整することができたので、それほどには問題になりませんでした。

ミスタードリラー2は2000年7月に発売された基板です。JAMMA VIDEO規格 第三版[PDF]の改訂発行日よりも後に発売ということになりますから、映像信号はJAMMA VIDEO規格から大きく外れてないんじゃないかなと思うのですが、さてどうでしょう。

今回はミスタードリラー2のテストモードを表示したままでの測定です(一応、ゲーム中でも同期信号に変化が無いことは確認しました)。

ミスタードリラー2の映像同期信号は複合同期です。垂直同期信号と水平同期信号が1つの信号線から出ています。水平同期信号が規則的に並んでいる中に垂直同期信号が垂直走査周波数の間隔で入ってくるような波形になります。垂直同期信号部分を拡大したものがこちらの画像です。

ミスタードリラー2同期信号

水平同期信号(水平同期パルス)の間隔1つ分が水平映像信号1本分の時間になります。垂直同期信号は走査線3本分の幅があり、その前後に垂直同期信号と同じ幅の等価パルスがあります(画像では左側の前等価パルスが見切れてしまっています)。同期信号だけみるとNTSCやコンポジット映像信号と同じです。
JAMMA VIDEO規格では映像信号の出力レベルはTTLレベルでHiレベル電圧は2.4Vから5.0Vの間となっています。画像をみると、ミスタードリラー2基板では、2.2Vくらいなので足りていないのですが、測定時につないでいる機器の影響を受けたのかもしれません。

普段、基板で遊ぶ時は自宅にあるSHARPのCZ-600DEというブラウン管モニタを使っています。これはアナログRGB対応モニタなのですが、垂直同期・水平同期が分離している信号しか扱えないので、アーケード基板のような複合同期信号の映像を映すことができません。そのため、複合同期信号を垂直同期信号と水平同期信号に分離しています。信号の分離には、LM1881NというICを使っています。秋月電気通商の通販ページにLM1881NのデータシートPDFがあり、これをみるとどのように映像信号が分離されるのかわかります。LM1881Nは複合同期信号を垂直同期信号と水平同期信号に分離するICと説明されていますし、私もそう思っていましたが、PDFをみると、コンポジット映像信号からコンポジット同期信号(複合同期信号)と垂直同期信号を取り出すICのようですね。

せっかくなので、LM1881Nで分離された2つの同期信号もみてみました。

LM1881N全体

赤い線が垂直同期信号、青い線が水平同期信号です。2つの信号レベル同じで重なってしまうので、垂直同期信号側のレンジを倍にしてあります。垂直同期信号を拡大したものがこちらです。

LM1881N VSYNC

よくみると、赤い線の垂直同期信号の開始タイミング(立ち下がり)と、元の複合同期信号に含まれる垂直同期信号の開始タイミングにズレがあるのがわかります。LM1881Nは複合同期信号内の垂直同期信号を検出してから、垂直同期信号を分離出力し始めるので、その検出時間分だけのズレがおきるのですね。この時間は水平映像信号の長さの半分になるので、LM1881Nを使うと走査線0.5本分の時間だけ垂直同期タイミングがズレることになりますが、ものすごく短い時間ですし、水平同期信号は変わらないのでモニタに出力される内容に変化はないはずです。
ちなみに、垂直同期信号の幅はLM1881Nのデータシートに記載されていて約230usとなっていますから、元の垂直同期信号の幅とは関係なく固定のようです。

同期信号と一緒にRedの映像信号もみてみました。本来、RGB映像信号はAC結合なのですが受け側に使う手元にコンデンサが無かったので波形をざっと眺める程度ということで。

Red映像信号

ミスタードリラー2は、テストモードからゲームの設定を変更できますが、設定の中に表示モードの変更というものがあり、インタレースとノンインタレースの切り替えが出来るようになっています。これまでの波形は全てノンインタレースのものでしたが、インタレース表示に切り替えると波形がどうなるのかみてみました。

インタレース表示

NTSCと同じように、フィールド毎に水平映像0.5本分だけタイミングがずれるのがわかります。ただ、垂直同期毎にトリガーをかけて連続してデータを取り込んでみると、このズレた信号が交互に出てこないことが頻繁に起きています。オシロのトリガーにひっかからない場合があるのかな、よくわかりません。

ノンインタレース時の水平同期期間は約63.553usでした。15.734KHzくらいです。水平同期期間を測るには手持ちのオシロの帯域幅の限界もあって、残念ながら細かいところまでは測定できません。

垂直同期期間はノンインタレース時が約16.715msでした。59.82Hzくらいでしょうか。インタレース表示に切り替えると垂直同期期間が変化して約16.682ms、約59.94Hzでした。
この59.82HzをGoogle検索してみると、PlayStation2エミュレータとして有名なPcsx2のソースコードがひっかかります。、これによると、PlayStation2のノンインタレース表示は59.82Hzとコメントされています。また、PlayStation2のインタレース表示時は59.94Hzになるようで、先ほどの測定結果と同じです。ミスタードリラー2基板はPlayStation互換のシステム基板でGPUには後期のPlayStation(9000)と同じCXD8561CQが使われているようですから、フレームレートからもハードの関係性がちょっとだけ見えてきますね。

映像信号を測る / PC-8801FA

2012年4月4日

(前置き:※PC-8800シリーズはバリエーション豊富なので機種毎に値が違う可能性があります。マニュアルにタイミングチャートが記載されているのかもしれませんが所有していません。私はPC-8801について詳しくなく、細かい仕様はよくわかっていません)

PC-8801FAはアナログRGBがD-SUB15ピンとして出力されていて、垂直同期信号と水平同期信号が別々になっています。測定はV2MODE,CPU速度4MHz,本体背面にあるモニタ解像度切り替えスイッチは15KHzに設定しました。ディスクを入れずに電源投入してしばらくするとHow Many Files?の表示になるので、この状態で放置しての測定です。

まずは垂直同期期間です。
15KHz Vsync

垂直同期期間は約16.003ms、測定時の有効数字でみると16.00msでした。最初から不安になる数字です。というのも周波数で表記すると62.5Hzです。一般的な60Hzという数値よりも離れています。
Enri’s Home PAGE (PC-8001)さんのページでは、PC-8001の垂直走査周波数が60Hz、Diary on windさんのページではPC-8801は61.226Hzと表記されています。
60Hzだと想定しているものに対して2.5Hzの差があるとなると結構大きいです。1秒間ごとに2.5回だけ画面更新のズレが生じますから25秒後には1秒分の画面のズレが起きることになります。PC-8801は垂直同期割り込みがあるので、割り込みでタイミングを取っているソフトで影響が出ますね。
これが本体の個体差によるものなのか、8800シリーズの種別による違いなのか、私の測定ミスなのかはわかりません。

続いて水平同期期間です。
8801FA水平同期期間

約62.465usでした。16.01KHzくらいでしょうか。これだと水平走査周波数が15KHzというよりも16KHzになってしまうので、測定時の誤差によるもの、もしくは、先の垂直走査周波数の事も考えると、測定に用いた8801FA内の水晶発振器にズレが出ているのかもしれません。

同期信号は負論理でTTLレベルです。水平同期信号のパルス幅は4.48us、垂直同期信号のパルス幅は499.86μsでした。

水平同期信号と垂直同期信号を並べたものがこちらです。
8801FA水平垂直同期信号 8801FA水平垂直同期信号拡大

青いラインが垂直同期信号、赤いラインが水平同期信号です。最初の画像では、水平同期信号の電圧レンジを変えてあります。垂直同期信号の同期パルス部分を拡大したのが2枚目の画像です。
1回の垂直同期信号期間は、約8本分の映像信号の期間と同じなのですが、よくみると2つの同期信号の立ち下がりタイミングにズレがあり、約11.8usほどでした。

今回は同期信号だけでなく、映像信号もみてみました。ただ、手持ちのオシロが2chなのでRGBのいずれかと同期信号のどちらかしかみれませんから、Redと水同期信号の組み合わせです。映像信号の受け方がわからなかったので、とりあえず75Ωの抵抗を使っています。
BASICからpaint(0,0),2:console,,0を実行してファンクションキーを非表示にして画面を赤一色にしています。(カーソルはどうやって消すんだろう…)

8801FA赤色のみ

Redの映像信号に水平同期信号のノイズが乗ってしまっているのは、両信号のGNDをまとめてしまったからかもしれません(PC-8801のRGB映像信号にはRGBそれぞれにGNDがあります)。
Redの映像信号が最大になっている期間、つまり赤い映像が表示されている期間は44.59us、水平同期信号の立ち上がりから赤の表示開始までは9.067us、赤の表示終了から水平同期信号の立ち下がりまでは4.53usでした。水平同期信号のパルス幅4.48usを加えると一本分の水平期間で62.667usになります。先ほどの水平期間の測定値62.465usとはちょっと計算がずれてしまいましたが、62.667usは15.957KHzですから、なんとか水平周波数15KHzといえる値に収まります。先の16.01KHzとの差が気になるのですが、0.1us単位での誤差なので判断が難しいところです。もっと厳密に調べないとダメですね。

ついでといってはなんですが、赤一色の状態だけではなんですから、縦線を1ドット毎に描いてみました。赤と黒が交互に表示されている縞模様です。BASICでCLS3:FOR X=0 TO 639 STEP 2:LINE(X,0)-(x,199),2:NEXTを実行しています。8801 BASICの座標範囲が0-639なのか1-640なのか知らないのですが雰囲気で。

8801FA赤縞模様 8801FA赤縞模様拡大

1枚目の画像を拡大したものが2枚目で、赤の映像信号がアナログ的に時間変化しているのがわかります。

15KHzモードでの測定は以上ですが、PC-8801FAには、V1MODEへの切り替えスイッチ以外にCPUを8MHzで動作させるためのスイッチがあるので切り替えて測定してみたところ、2つのスイッチをどのように切り替えても映像同期信号に変化はありませんでした。

さて、PC-8801FAは背面の切り替えスイッチで映像信号を24KHzにすることが出来るので併せて測定してみました。同期信号のみための形状は15KHzの時と同じなので測定のキャプチャ画像はありません。ざっとまとめると、垂直同期期間が約18.05ms(55.4Hz)、垂直同期期間が約40.35us(24.78KHz)でした。
15KHzと24KHzでは垂直走査周波数が5Hzほど違うので垂直同期割り込みでタイミングをとっているゲームでは影響がありそうなのですが、どうしていたんだろう・・・。プログラム側から強制的に15KHzにすることが出来たのか、それとも24KHzだと速度が変わっちゃったりしたのでしょうか。

それから、PC-8801はI/Oポートの50H,51Hあたりを使ってCRTCを操作できるようです。これによって周波数が操作できるかもしれませんが、その辺の事は詳しくないので未調査です。

映像信号を測る / PC-6001mkII RGB

2012年4月1日

PC-6001mkII背面のデジタルRGB出力から水平・垂直同期信号を測定してみました。

PC-6001mkIIでは付属の取扱説明書にタイミングチャートが記載されているため、あえて測定する必要はないのですが、マニュアルと実測値が違うことはよくありますし、デジタルオシロで2チャンネル同時測定をしてみる題材として、あらかじめ数値がわかっている機材を使った方が都合がよいのです。

マニュアル掲載のタイミングチャートではこのようになっています。上図が水平方向の各種タイミングで、下図が垂直方向です。水平方向は64.696μs(15.457KHz)、垂直方向は16.688ms(59.922Hz)ということになっています。

PC-6001mkII描画タイミング

PC-6001mkII描画タイミング

タイミングチャートの水平方向の図では、水平同期信号がフロントポーチ・バックポーチで階段状に変化しているかのようにみえますが、実際には、TTLレベルで同期信号のパルスが負論理で発生するだけです。

mkII_Hsync

mkII水平同期信号

垂直方向も同様で、TTLレベルで負論理でした。同期期間もマニュアル通りです。

mkII_Vsync

mkII 垂直同期信号

水平同期信号と垂直同期信号を同時に測定したのがこちらです。2つの信号を重ね合わせると判りにくくなるので、垂直同期信号の電圧値を倍にして表示してあります。タイミングチャートによると、垂直同期信号の間に水平同期信号が262本あるはずです。

mkII 水平同期と垂直同期信号

mkII 水平同期と垂直同期信号

もうひとつ、垂直同期信号がActiveになった瞬間の拡大図です。垂直同期信号のパルス幅は水平映像信号3本分に該当していることがわかります。これもマニュアル通り。

mkII 垂直同期信号拡大図

mkII 垂直同期信号拡大図

これらの映像信号はmkIIのモードに関わらず一定です。PC-6001mkIIの垂直方向画素数はMODE1では192、MODE5では200ですが、垂直方向の走査線数は画素数に関係なく一定なので変化しません(Z80 BUSREQは別の話です)。RGB信号も併せて調べてモード別のディスプレイエリアを比較してみるとわかりやすかったかもしれませんね。
また、リセットボタンを押しっぱなしにしている時も同期信号は変化しませんでした。

m5版 Moon Patrol / ムーンパトロール

2012年4月1日

ニコニコ動画に動画をUpしました。

ムーンパトロール

m5版 DIG DUG / ディグダグ

2012年4月1日

ニコニコ動画に動画をUpしました。

m5版ディグダグ タイトル m5版ディグダグ

PC-6001版フィッシング

2012年3月28日

「フィッシング」というPC-6001用のゲームがあります。タイニーゼビウスやドアドアmkIIみたいなメジャータイトルではありませんが、私が個人的に好きなゲームのひとつです。パッケージ写真はこちら。

フィッシングパッケージ

マニュアルには“データイースト社から1982年に発売されたアーケードゲームの「フィッシング」を移植したものである”と記述されています。私はアーケード版のゲーム画面を今まで見たことが無く、海外のサイトThe Arcade Flyer Archiveでチラシを確認したぐらいです。ゲームの内容などについては@Hashiさんが作られているPC-6001同人誌のPC6000NOTE No.4で触れています。なんだか宣伝くさい感じの書き方ですがw

さてそのアーケード版ですが、なんと、デコカセ復活の一環として、@le_renard88さんがアーケード基板から録画したものをニコニコ動画にUpされました。

ちなみにPC-6001版の画面(エミュレータキャプチャ)はこちら。
PC-6001版フィッシング タイトル PC-6001版フィッシング ゲーム画面

@le_renard88さんことルドン ジョゼフさんは、NPO団体であるゲーム保存協会を立ち上げて活動されています。活動内容はニュース記事にもなっていますので、そちらをご覧ください。

レトロゲームは文化財?! 医師、オペラ歌手などが旧世代ソフトを収集・保存へ

映像信号を測る / PC Engine DUO-R コンポジット信号編

2012年3月15日

映像信号を測る / 初代メガドライブ コンポジット信号編に引き続き、今回はPC Engineです。CとEの間に-が入らない方です。

いつものように独自調査なので無保証です。測定に用いたPC EngineはDUO-Rで、RGB化改造を施しているため、その影響がコンポジット信号に出ている可能性があります。

測定値を出す前にこれまでの補足です。色々と映像信号について調べていて気になった情報があったのでリンクします。まず、映像タイムベース測定法によると…

カラーバーストの位相は1本ごと180度反転するのが正式です。(ファミコンは反転している)
メガドライブでは反転させると画面がぎらつく為、反転させずに設計されました。(PCエンジン、MSXも同様)その結果NEC製のデジタルテレビで色が出なくなりました。
サターンでは反転させています。

という記述があります。「カラーバーストの位相が反転する事自体は知っていて、気にしてこなかったのですが、反転させていないハードがあるとまでは考えていませんでした。その辺も見ておけばよかったですね。

また、PCE 互換機の開発メモの画面表示の詳細に興味深い情報があり、PC Eingineはラインによって黒の色味が違うようなのですね。表示されない領域の色の話なのですが、信号をよくみていないと気がつかない点です。
ゲーム機によって映像の黒レベルがどう違うのか(海外ゲーム機ではセットアップも変えてあるのか)は気になるところなので、機会があれば調べたいところです。ただ、そこまで調べるのも大変なので、今のところの方針は映像の周波数を重点的にみたいと思います。

更にもう一点。ゲーム機は色々な描画モードを持っています。モードの変更が映像信号にも出るでしょうから、ここでの測定値は常に一定ではないと思います。例えば、あるモードでは垂直周波数59.94Hzで動作しているけど、描画モードを変更したら59.8Hzになる、という可能性は充分にありえると思います。

さて本編。測定は、DUO-R起動後のSTART待ち画面と音楽CD再生画面、それからたまたま手元にあったラプラスの魔の名前入力画面の3つを何回か測定して平均値を出しています。
まずは水平映像信号です。

PCE水平映像信号

PCE水平映像信号

水平同期の期間は平均すると63.55μsで、15.73HzというNTSCの規定値です。ごくごくたまに、63.8μsみたいな値を拾うことがあり、その辺を入れて平均を出すと規定から大きく外れてしまうので、こういう測定は平均を求めるより、ばらつき具合の集計を取った方がいいのかな。

続いて垂直同期の期間です。一画面分の波形をみてもゴチャゴチャしてるだけなので画像はありません。16.71μsで、59.82Hzでした。59.94Hzからちょっと外れているように見えます。Googleで59.8Hzを検索してみたところ、PC EngineエミュレータのOotakeでは垂直同期を59.8Hzとしているという記述がありました。なんというこだわりっぷり。ステキです。
また、59.82Hzをキーワードに検索してみると、PS2のノンインタレース時の周波数だったり(インタレースだと59.94Hz)、NintendoDSの液晶表示の周波数だったりと興味深いです。NDSのGBAモードとGameBoyMicroで垂直同期が違うというのは始めて知りました。[参考:http://www.pat.hi-ho.ne.jp/sata68/200601.html#31]

59.94Hzと59.82Hzの差は0.12Hzです。59.94Hzの映像機器で59.82Hzのソフトを動かした場合、まぁ要するにエミュレータとかのその辺の事ですけど、1秒間に0.12フレームのズレが生じるということは約8.3秒毎に1フレのズレが生じるので、調整しないと音と合わなくなりますよね。

垂直同期信号周辺の拡大波形はこちら。

PCE 垂直同期信号

PCE 垂直同期信号


等価パルスと垂直同期信号に切り込みパルスがないのですが、ノンインタレース表示ではフィールドの識別は不要なので、無くても構わないのですね。

PC Engineの映像波形は部分的に拡大してもオーバーシュート/アンダーシュートが小さくてパッキリとした綺麗な波形でした(コンポジットなので映像が綺麗かどうかは別ですが)。