2016 新年記念 & eFM-7移植作業1周年記念、 「eFM-7とその他諸々のこと」 Jan 1,2016 K.Ohta * Sorry, this document is written in Japanese only, I can't use english well, if you interest of this and you can translate from Japanese to any languages, please translate this. This document is released with GFDL, you can copy and redistribute this document under GFDL. This document is written with UTF-8.  この文書は、GFDL(GNU Free Document License)に沿った形で  のコピーや再配布が可能です。 英語が下手なので日本語だけで書きます、ごめんなさい(´・ω・`) 日本語から他の言語に翻訳できる方がいましたら、是非お願い しますm(_ _)m 1.これはなんですか(直訳)  eFM-7を作る前段として、Common Source Code Project(以下CSP) をQt+OpenGLに移植する作業をはじめてから、昨年12月30日で一周年 となりました。そこで、たぶん30年位経ったら歴史的価値が出るかも 知れないな。と思って(^_^;今に至る、色々雑多なことをまとめておこ うと思いました。 2.前史:XM7/SDL  前から、XM7と言う非常に優れたFM-7エミュレータ[1]がありました。  しかし、これはWindowsでしか動きませんでした。  2008年だったか09年だったかの当時、これをGP2X[2]と言う韓国の 携帯ゲーム機で動かし、ザナドゥをやってみたいな。[3]と言う気持ちが あって、XM7作者のたけがみさんと基を作られたPI.さんに許諾お願いした ら、PI.さんは快諾されたものの、たけがみさんは本当にできるのかどう か怪しまれていたようで最初はいまいちだったのですが、SDLとGtkに 一時的に移植したもののコードとスクリーンショットをお見せしたら、 比較的簡単に許諾をいただけたので、本格的な作業をはじめました。 [1] http://retropc.net/ryu/xm7/ 現在開発終了 [2] https://ja.wikipedia.org/wiki/GP2X [3] 結局はマシンスペックの問題でGP2X系への移植は諦めたのですが…  で、最初期は、05年前後にGimons氏がGtkに移植していたたのを参考 にして、当時最新版のXM7をGtkとSDLに移植する所から始めた訳です。  その上で、GtkだとGP2Xでは動かせない。というだけの理由で、SDL上 で動くGUIツールキットを探し、Agar[4]と言う物にたどり着いて採用し た訳です。 [4] http://www.libagar.org/  当時は、色々と病気が吹き出していて、ねたきり寸前でキーボードも 布団から打つ日すら少なくない状況で、今考えるといつ病死していても 全くおかしくなかった状態でして、病気で身体が動かない合間を縫って の作業となりましたが、2010年の頭には、そこそこ実用性があるものが出 来ました。  ただし、Agarがバグだらけなのを除いて。  その上で、バグを一つ一つ潰し、途中で負荷分散を真剣に考えた末に マルチスレッド化[5]からOpenCLへのオフロードを2011年前後に行い、 その上で開発が低調になっていきました。 [5] これは、eFM-7やCSP/Qtにも活かされてます。OpenCLは、 パフォーマンスが出ないので今後は多分やらないと思いますが。  本家(たげがみさん版XM7)がほぼ完成させてしまったこともあります が、東日本大震災でラジオの重要さに気がついたことがあり、Open I2C Radio[6][7]と言うプロジェクトに注力する事になったのが大きいです。 [6] https://osdn.jp/projects/openi2cradio/ [7] http://sky.geocities.jp/artanejp/  そんなこんなで、2014年も終わりに近づくまで、二つのプロジェクトを 進め、Open I2C Radioは2013年の半ば(だったと思う)にはほぼ安定し て、次のプロジェクトとして、RTL2832Uを使った1セグ受信用のUSBドング ルを短波や中波を受信する事に転用するプロジェクト([7]に収載)をやった りしていました。 3.XM7について  元々、C++が余りパフォーマンスが出せない時代に原型が出来たEM7を引き 継いでいる為に、C++のGUI部分やFM音源エミュレータと、C言語の本体という、 非常にちぐはぐではあるけど、たしかにパフォーマンスも出るし正確さも未だ 私のeFM7よりは優れたものです。その上で、私がC++中心のUIやSDLを使った レンダラを加えるという、なんか屋上屋を重ねた物になってしまい、一度最初 から作り直したいよな。と言う欲望が2014年の半ば位にはありました(懺悔)。  その上で、ドイツ人のAnna Wu氏と言うエミュレータコレクタ(と言ってい いんだろうか?)の方が、2014年の半ばくらいからたけがみ氏とやり取りし ていたようなんですが、最終的に英語でのやり取りをたけがみ氏やその周辺 が嫌がり、揉めるということがありました。  で、その過程をTwitterで見ていて、いい加減嫌気が差したというか、私は めちゃくちゃ英語が下手な人間ですが元々Debian GNU/Linux[8]等にバグ レポートを投げたり必要に迫られれば英語のコミュニティで開発に関する議論 をするのが普通になってた人間でもありますので、なんかその過程に物凄い 違和感を感じ、「ここは自分のいるべき場所じゃないんじゃないか」と思い、 古くからの友人に愚痴ったりもして、まぁその人は仕事で外国のメーカにも 行く人だったから(名前は出せないし多分有名ではないけど、技術力は国内 トップクラスのだと思う)、愚痴を訊いてくれて…「ま、英語でやるの当た り前やん(^^)」と言ってくれたのがあって、背中を圧された訳ですね。  それが、2014年の12月28日だったか。  結局、CSPにFM-7系を乗っける方向に、舵を切り、2014年の12月30日にgit リポジトリ[9]を構築して、そこに当時の最新のCSPのソースコードを入れた訳で す。 [8] 奇しくも、2015年12月28日に、Ian Murdok氏が警察の暴行により、亡く なられました。享年42。 [9] https://github.com/Artanejp/common_source_project-fm7 4.CSPの移植開始  移植にあたって、最初はツールキットについてはAgarを使っていました。 とりあえず動きますよ。と言う検証作業が楽だからです。  そこで、最初にX1 TurboとPC-8801MAを動かしました。[10]その上で、 Agarはバグが多いし移植性とか色々問題を抱えてるので、別の汎用性の高い ツールキットを使うことにした訳です。[11] [10] 動作検証するためのソフトウェアがたくさんありましたので(^_^; [11] もう、GP2Xで動かすのは諦めました(^_^;  で、何を使おうかな。と思いましたが、Gtkは3になってどんどんアレコレ 必要になってきた上に、Gnome 3のバグの多さもあって印象が良くなかった ので、じゃぁ、全く使ったこと無いけどQtにしちゃいましょう。と。  調べてみると、音声関係とジョイスティックは標準で持ってなかったの で、SDLに任せましょう。描画周りはOpenGL必須にしましょう。慈悲はない。  と言う事で、大まかな方針を立てて、移植をしていった訳です。  この作業自体は、Qtを手探りで使っていて物凄く汚くも統一性のないコード ではあったものの、2015年の3月には大半のVMをのせることが可能になるに 至りました。  gitのログを見てると、 ・1月8日に、AgarでX1がほぼコンパイラが通せて大まかに動かせた (commit fc894319809e05692fd447a5f232a46ebdf17c7 の少し後) ・1月10日に、Agarの駄目さに音を上げて、Qtに転換する事を決断した (commit 98ac2645ec6a3798072445ac003f08d529d6065c )  ・1月11日に、Qtでコンパイラが通るようになった   (commit 1033cc86e36b8e1d38771ef404e7d43ad07ebb39 )  ・1月12日に、描画系とGUIの基礎が完成しVMが動いた?(ただしバグあり) (commit e5887aa7464c7276eef9d2578ea880988f3da60d ) ・1月13日に、キーボード系が出来て描画系のバグも一旦取れた (commit 6deec5abac027eca1a71fa89e485650d3c9735da )  と言う感じで、12月30日に着手し、そこから10日間はAgarでなんとかしよう としたけど、色々嫌になったのかQtに切り替えて、一日でQt適用のための基礎 設計が上がり、そこから一週間で、今の基礎になる部分が出来上がっていった 訳ですね。  そこから、どんどんと幾つかのVMを動くようにしていくので、1月28日まで 進み[12]、そこからは既存のVMを動くようにするのとFM-7の本格的な実装を していった訳です。[13] [12] commit ce574213769b2685ead0df84c81f193e519d3906 以降 [13] 2014年12月31日にはFM-7の実装を試みてやっていたのですが (commit e409be1add5f6b9ddf76bada7c24469cb35ae2bc 以降)、 色々立ちゆかなくなかったのでAgarやQtの本家への適用を先にする 事になったのでしたが… 5.eFM-7  さて、ここまでくれば、FM-7の移植ですね。となり、実家から保護した80年代 のOh!FM誌とWEB上に散在するFM-7のI/Oマップと本家CSPのVMコード、後は当時は 公開されてたXM7のソースコードにあるTips的なhackの内容を汲みとって、自前で コードを再構築していった(著作権侵害はしたくないので…)上で、 2015年の2月から3月にかけて、FM-7の実装をやっていった訳です。  で、3月11日(奇しくも東日本大震災から四周年の日だ!)に動かないまでも リンクが通るようになり[14]、6809 MPUの記述の間違い[15]やdisk.cpp/mb8877.cpp での時分秒フォーマット[16]対応部分を直しつつ、3月の末には、多くのFM-7用ソフ トが動くようになりました。[17] [14] commit 65fe797cd5a681ba25c14a88566d7c80d0a8cd9a [15] これは、基になってるMAMEのコードのヴァージョンが旧いことに由来する物で、    勿論、雑多な未定義命令は実装されてなかったですし、フラグの動きも問題が    ありました。    ここら辺の修正作業は2015年の11月まで引きずっていて、途中で神奈川県立    川崎図書館に行って、多くの(実家で破棄されてしまった)資料を入手し、    MC6809以外の部分を含めて修正に修正を重ねていきました。    今のmc6809.cppは完成版と言って支障ないと思っています。汚いですが(^_^; [16] MB8877は、フォーマット時のデータ列でのF5,F6,F7をFDCに対するコマンドに 割り当ててますので、特殊なことをやらないと、セクタ番号F5〜F7は書く事が 出来ないです。80年代の、パソコンではこれをコピープロテクトに使ったソフト が沢山あって、当時F5〜F7のキャラクタコードが「時分秒」であったので、 この手の特殊フォーマットは「時分秒フォーマット」と呼ばれていました。 この「時分秒」IDのセクタやギャップ中に書かれた時分秒コードをチェックし たり、重要なプログラムを入れることでコピー防止=プロテクトを狙っていまし たが、多くのコピーツール(CopyBoy7など)がユーザのディスクドライブだけで時 分秒フォーマットを再現できるようになったことから、不安定データ・ビットず れと呼ばれる特殊なデータをセクタに入れ、そのセクタを読んでデータの変化が 「正しい」事をチェックするようなプロテクトと、時分秒プロテクトはセットで 使われていくようになりました。 [17] commit 3c875fb911e484c15bfdad2f67dadb9bdedd5e75  次に目標にしたのは、FM77AVでした。  これは、MMUや論理演算・直線補間LSI(ALU)と言った独自デバイスを積んでいて、 ALUの基本的なコマンド列は、XM7を参考にしました。  Anna氏とたけがみ氏が揉めた最大の理由が、MESSがこの辺りのデバイスの内部 記述をXM7から丸パクリした事に対して、Anna氏を通じて抗議したものの、MESS コミュニティからの回答が全く無い。と言う非常にふざけた話に端を発したことで したので、この辺りは他の部分に増して気をつけて書いたつもりです。[18]  現状、仕様通りには動くようになっていて、ALUの細かいhackができてないかも… と言う感じのところです(サイオブレードの字の描画とか)。  タイミング計算には若干の問題が出てますので、直す機会を伺ってはいます。 [18] ALUの内部構造で、直線補間機能でC言語の割り算演算を使って書かれてるの    は、実はそういう理由からだったりします。  ここら辺含めて、2ちゃんねるの「昔のPC」板の、PCエミュレータ総合スレに ちょくちょくバイナリを投げてはバグ報告や改善案をスレ住人の皆さんにお聞きする ようになったのも、この辺りからだったと思います。当時はWindowsでは動かなかった のではありますが(後に動かせるようになる)。  この作業はなんだかんだで難航してまして、ほとんどのソフトが齟齬なく動くよう になったのが、6月16日前後でした。結局三ヶ月かかってる。[19] [19] commit 1b4320ef6229e75013478fe1ec66ed1eb3c47bd5  次は、FM-77を作りました。これは、そんなに苦しくなく進められました。ただし、 現物を持っていないFM-77L4の400ライン部分を諦めることでですが。  ただし、ブートシーケンスやメモリマップがFM-7とも77AVとも微妙に違うところは 見落としそうになって、後から気がつくこともありました。特にブートRAM周り。  さて、ここまで来たら、FM77AV40EXのDMACその他を実装することに、必然的になる 訳ですが…動くソフトが増えると色々なバグが噴き出してきたり、色々弄らないといけ なくなるので、なんだかんだでここでも数カ月かかりました。  この時期の成果の多くが、CSP原作者の武田さんの作業にフィードバックされています。  武田さん、本当にありがとうございます m(_ _)m …で、9月の14日に、AV40EXもほぼ大丈夫になり[20]、そこからはWindowsへの適用 や、全てのVMを移植していくようになる訳です。  FM-8はやるやる詐欺をしてしまってますが、いい加減やっていこうと思ってはいます。 [20] commit bbf5ed7132304d6e4c19da3cb2d634923eb55a5b あたり  そして、そこからの一ヶ月弱でMinGWを使ってのWindows向けクロス開発環境を構築 したり、ライブラリのAPIの違いを吸収し、Win32版もバイナリパッケージになるべく同梱 するようにして、武田さんとの2ちゃんねるを経由しての議論を交わしつつ、今に至る 訳です。 5.さいごに  CSPも、Qt適用版も、まだまだ進化していきます。私の側から提案するものもあれば、武田 さんが提案する物や2ちゃんねるのスレ住人の提案を入れ込んだものもある。  こういう、FOSSの醍醐味のようなものをできるというのは、本当にいいなと思います。  そして、FM-7系に関しては、特にAV系の検証が甘いのは否定できないので、色々とやってい く事がぱらぱらとあるでしょう。でも、まぁ、マイペースでこれからもやっていきますので、 武田さんとユーザの皆様含め、皆様よろしくお願いします m(_ _)m 2016 1.1 K.Ohta ※追記: 6.おまけ1:「1/60秒問題」に関して。  エミュレータには、「1/60秒問題」と言うのがあります。  実際のディスプレイと、エミュレーションするディスプレイの垂直帰線の速度が違うとか タイミング的に同期が取れない場合が多いとか言う理由で、最低でも実際のディスプレイの 1フレーム=1/60秒のズレが生じてしまうのをどうするか。と言う話で、このズレを解消する しないで度々議論が起こります。  1/60秒以内のズレを売りにしたエミュレータなんかも、ありますよね。  私の立場は、「2フレームまではずれても仕方ない」というものです。  どういう事かというと、1フレームの遅れは上記のマシンの差から出てくる物で、もう 1フレームの遅れは、間にDirect XやOpenGLが挟まることで、「前のフレーム期間に描画した ものを表示することでチラツキをなくす」構造がホストマシンのOS側で普通に用意されていて、 そこら辺はアプリケーションから直に触るのが困難な場合があるからです。  つまり、最悪で2フレーム程度のズレ(垂直帰線周波数が著しく違う場合はもう少し)は ディスプレィの垂直帰線周波数が違う以上は回避出来ないのを考えていこう。と言う事で。  そこまで突っ込むのは通常のアプリケーションがやるものでもないし、OS側の設定で緩和 可能な場合もある話ですしね。  最終的には、OS側が用意してるVBLANK割込でCSP側も同期させればいいのでしょうけど、 そんなことまで考えるのはなんだかなぁ。と、個人的には思うのです。そこら辺は、CSPを 基にカスタマイズする方々でやってみてください(多分GLかDirect XかVulkanかでかなり コードが変わるでしょうから…)。GPLv2はそのためにもあるのですよ。などと私は思うの です(^_^; 改定履歴: 2016-01-05 2ちゃんねるエミュレータ総合スレでのご指摘を基に、       許諾を頂く事実関係の記述を一部見直し。後、6.項を追加。 2016-01-07 ↑の板での時分秒プロテクト/フォーマットの表現についての指摘に対して、 追記修正した(怖々) 2016-09-15 しかたないからGoogle翻訳した日本語文章をABOUT_eFM7_1.en.txtとして追加。 ま だ 語 句 校 正 な ど 全 く や っ て ま せ ん