OSDN Git Service

[VM][UPD7810] Fix FTBFS.
[csp-qt/common_source_project-fm7.git] / doc / ABOUT_eFM7_1.txt
1 2016 新年記念 & eFM-7移植作業1周年記念、
2 「eFM-7とその他諸々のこと」
3       Jan 1,2016 K.Ohta <whatisthis.sowhat _at_ gmail.com>
4
5 * Sorry, this document is written in Japanese only,
6   I can't use english well, if you interest of this
7   and you can translate from Japanese to any languages,
8   please translate this.
9   This document is released with GFDL, you can copy
10   and redistribute this document under GFDL.
11   This document is written with UTF-8.
12  この文書は、GFDL(GNU Free Document License)に沿った形で
13  のコピーや再配布が可能です。
14   英語が下手なので日本語だけで書きます、ごめんなさい(´・ω・`)
15   日本語から他の言語に翻訳できる方がいましたら、是非お願い
16   しますm(_ _)m
17
18
19 1.これはなんですか(直訳)
20  eFM-7を作る前段として、Common Source Code Project(以下CSP)
21 をQt+OpenGLに移植する作業をはじめてから、昨年12月30日で一周年
22 となりました。そこで、たぶん30年位経ったら歴史的価値が出るかも
23 知れないな。と思って(^_^;今に至る、色々雑多なことをまとめておこ
24 うと思いました。
25
26 2.前史:XM7/SDL
27  前から、XM7と言う非常に優れたFM-7エミュレータ[1]がありました。
28  しかし、これはWindowsでしか動きませんでした。
29  2008年だったか09年だったかの当時、これをGP2X[2]と言う韓国の
30 携帯ゲーム機で動かし、ザナドゥをやってみたいな。[3]と言う気持ちが
31 あって、XM7作者のたけがみさんと基を作られたPI.さんに許諾お願いした
32 ら、PI.さんは快諾されたものの、たけがみさんは本当にできるのかどう
33 か怪しまれていたようで最初はいまいちだったのですが、SDLとGtkに
34 一時的に移植したもののコードとスクリーンショットをお見せしたら、
35 比較的簡単に許諾をいただけたので、本格的な作業をはじめました。
36
37 [1] http://retropc.net/ryu/xm7/  現在開発終了
38 [2] https://ja.wikipedia.org/wiki/GP2X
39 [3] 結局はマシンスペックの問題でGP2X系への移植は諦めたのですが…
40
41  で、最初期は、05年前後にGimons氏がGtkに移植していたたのを参考
42 にして、当時最新版のXM7をGtkとSDLに移植する所から始めた訳です。
43  その上で、GtkだとGP2Xでは動かせない。というだけの理由で、SDL上
44 で動くGUIツールキットを探し、Agar[4]と言う物にたどり着いて採用し
45 た訳です。
46 [4] http://www.libagar.org/
47
48  当時は、色々と病気が吹き出していて、ねたきり寸前でキーボードも
49 布団から打つ日すら少なくない状況で、今考えるといつ病死していても
50 全くおかしくなかった状態でして、病気で身体が動かない合間を縫って
51 の作業となりましたが、2010年の頭には、そこそこ実用性があるものが出
52 来ました。
53  <B>ただし、Agarがバグだらけなのを除いて</B>。
54  その上で、バグを一つ一つ潰し、途中で負荷分散を真剣に考えた末に
55 マルチスレッド化[5]からOpenCLへのオフロードを2011年前後に行い、
56 その上で開発が低調になっていきました。
57
58 [5] これは、eFM-7やCSP/Qtにも活かされてます。OpenCLは、
59     パフォーマンスが出ないので今後は多分やらないと思いますが。
60    
61  本家(たげがみさん版XM7)がほぼ完成させてしまったこともあります
62 が、東日本大震災でラジオの重要さに気がついたことがあり、Open I2C
63 Radio[6][7]と言うプロジェクトに注力する事になったのが大きいです。
64
65 [6] https://osdn.jp/projects/openi2cradio/
66 [7] http://sky.geocities.jp/artanejp/
67
68  そんなこんなで、2014年も終わりに近づくまで、二つのプロジェクトを
69 進め、Open I2C Radioは2013年の半ば(だったと思う)にはほぼ安定し
70 て、次のプロジェクトとして、RTL2832Uを使った1セグ受信用のUSBドング
71 ルを短波や中波を受信する事に転用するプロジェクト([7]に収載)をやった
72 りしていました。
73
74 3.XM7について
75  元々、C++が余りパフォーマンスが出せない時代に原型が出来たEM7を引き
76 継いでいる為に、C++のGUI部分やFM音源エミュレータと、C言語の本体という、
77 非常にちぐはぐではあるけど、たしかにパフォーマンスも出るし正確さも未だ
78 私のeFM7よりは優れたものです。その上で、私がC++中心のUIやSDLを使った
79 レンダラを加えるという、なんか屋上屋を重ねた物になってしまい、一度最初
80 から作り直したいよな。と言う欲望が2014年の半ば位にはありました(懺悔)。
81  その上で、ドイツ人のAnna Wu氏と言うエミュレータコレクタ(と言ってい
82 いんだろうか?)の方が、2014年の半ばくらいからたけがみ氏とやり取りし
83 ていたようなんですが、最終的に英語でのやり取りをたけがみ氏やその周辺
84 が嫌がり、揉めるということがありました。
85
86  で、その過程をTwitterで見ていて、いい加減嫌気が差したというか、私は
87 めちゃくちゃ英語が下手な人間ですが元々Debian GNU/Linux[8]等にバグ
88 レポートを投げたり必要に迫られれば英語のコミュニティで開発に関する議論
89 をするのが普通になってた人間でもありますので、なんかその過程に物凄い
90 違和感を感じ、「ここは自分のいるべき場所じゃないんじゃないか」と思い、
91 古くからの友人に愚痴ったりもして、まぁその人は仕事で外国のメーカにも
92 行く人だったから(名前は出せないし多分有名ではないけど、技術力は国内
93 トップクラスのだと思う)、愚痴を訊いてくれて…「ま、英語でやるの当た
94 り前やん(^^)」と言ってくれたのがあって、背中を圧された訳ですね。
95
96  それが、2014年の12月28日だったか。
97  結局、CSPにFM-7系を乗っける方向に、舵を切り、2014年の12月30日にgit
98 リポジトリ[9]を構築して、そこに当時の最新のCSPのソースコードを入れた訳で
99 す。
100
101 [8] 奇しくも、2015年12月28日に、Ian Murdok氏が警察の暴行により、亡く
102     なられました。享年42。
103 [9] https://github.com/Artanejp/common_source_project-fm7
104
105 4.CSPの移植開始
106
107  移植にあたって、最初はツールキットについてはAgarを使っていました。
108 <B>とりあえず動きますよ。と言う検証作業が楽だから</B>です。
109  そこで、最初にX1 TurboとPC-8801MAを動かしました。[10]その上で、
110 Agarはバグが多いし移植性とか色々問題を抱えてるので、別の汎用性の高い
111 ツールキットを使うことにした訳です。[11]
112
113 [10] 動作検証するためのソフトウェアがたくさんありましたので(^_^;
114 [11] もう、GP2Xで動かすのは諦めました(^_^;
115
116  で、何を使おうかな。と思いましたが、Gtkは3になってどんどんアレコレ
117 必要になってきた上に、Gnome 3のバグの多さもあって印象が良くなかった
118 ので、<B>じゃぁ、全く使ったこと無いけどQtにしちゃいましょう。</B>と。
119  調べてみると、音声関係とジョイスティックは標準で持ってなかったの
120 で、SDLに任せましょう。描画周りはOpenGL必須にしましょう。慈悲はない。
121  と言う事で、大まかな方針を立てて、移植をしていった訳です。
122  この作業自体は、Qtを手探りで使っていて物凄く汚くも統一性のないコード
123 ではあったものの、2015年の3月には大半のVMをのせることが可能になるに
124 至りました。
125  gitのログを見てると、
126   ・1月8日に、AgarでX1がほぼコンパイラが通せて大まかに動かせた
127      (commit fc894319809e05692fd447a5f232a46ebdf17c7 の少し後)
128   ・1月10日に、Agarの駄目さに音を上げて、Qtに転換する事を決断した
129      (commit 98ac2645ec6a3798072445ac003f08d529d6065c )
130  ・1月11日に、Qtでコンパイラが通るようになった
131   (commit 1033cc86e36b8e1d38771ef404e7d43ad07ebb39 )
132  ・1月12日に、描画系とGUIの基礎が完成しVMが動いた?(ただしバグあり)
133      (commit e5887aa7464c7276eef9d2578ea880988f3da60d )
134   ・1月13日に、キーボード系が出来て描画系のバグも一旦取れた
135      (commit 6deec5abac027eca1a71fa89e485650d3c9735da )
136  と言う感じで、12月30日に着手し、そこから10日間はAgarでなんとかしよう
137 としたけど、色々嫌になったのかQtに切り替えて、一日でQt適用のための基礎
138 設計が上がり、そこから一週間で、今の基礎になる部分が出来上がっていった
139 訳ですね。
140  そこから、どんどんと幾つかのVMを動くようにしていくので、1月28日まで
141 進み[12]、そこからは既存のVMを動くようにするのとFM-7の本格的な実装を
142 していった訳です。[13]
143
144 [12] commit ce574213769b2685ead0df84c81f193e519d3906 以降
145 [13] 2014年12月31日にはFM-7の実装を試みてやっていたのですが
146      (commit e409be1add5f6b9ddf76bada7c24469cb35ae2bc 以降)、
147      色々立ちゆかなくなかったのでAgarやQtの本家への適用を先にする
148      事になったのでしたが…
149
150 5.eFM-7
151  さて、ここまでくれば、FM-7の移植ですね。となり、実家から保護した80年代
152 のOh!FM誌とWEB上に散在するFM-7のI/Oマップと本家CSPのVMコード、後は当時は
153 公開されてたXM7のソースコードにあるTips的なhackの内容を汲みとって、自前で
154 コードを再構築していった(著作権侵害はしたくないので…)上で、
155 2015年の2月から3月にかけて、FM-7の実装をやっていった訳です。
156  で、3月11日(奇しくも東日本大震災から四周年の日だ!)に動かないまでも
157 リンクが通るようになり[14]、6809 MPUの記述の間違い[15]やdisk.cpp/mb8877.cpp
158 での時分秒フォーマット[16]対応部分を直しつつ、3月の末には、多くのFM-7用ソフ
159 トが動くようになりました。[17]
160
161 [14] commit 65fe797cd5a681ba25c14a88566d7c80d0a8cd9a
162 [15] これは、基になってるMAMEのコードのヴァージョンが旧いことに由来する物で、
163    勿論、雑多な未定義命令は実装されてなかったですし、フラグの動きも問題が
164    ありました。
165    ここら辺の修正作業は2015年の11月まで引きずっていて、途中で神奈川県立
166    川崎図書館に行って、多くの(実家で破棄されてしまった)資料を入手し、
167    MC6809以外の部分を含めて修正に修正を重ねていきました。
168    今のmc6809.cppは完成版と言って支障ないと思っています。汚いですが(^_^;
169 [16] MB8877は、フォーマット時のデータ列でのF5,F6,F7をFDCに対するコマンドに
170      割り当ててますので、特殊なことをやらないと、セクタ番号F5〜F7は書く事が
171      出来ないです。80年代の、パソコンではこれをコピープロテクトに使ったソフト
172      が沢山あって、当時F5〜F7のキャラクタコードが「時分秒」であったので、
173      この手の特殊フォーマットは「時分秒フォーマット」と呼ばれていました。
174      この「時分秒」IDのセクタやギャップ中に書かれた時分秒コードをチェックし
175      たり、重要なプログラムを入れることでコピー防止=プロテクトを狙っていまし
176      たが、多くのコピーツール(CopyBoy7など)がユーザのディスクドライブだけで時
177      分秒フォーマットを再現できるようになったことから、不安定データ・ビットず
178      れと呼ばれる特殊なデータをセクタに入れ、そのセクタを読んでデータの変化が
179      「正しい」事をチェックするようなプロテクトと、時分秒プロテクトはセットで
180      使われていくようになりました。
181 [17] commit 3c875fb911e484c15bfdad2f67dadb9bdedd5e75
182
183  次に目標にしたのは、FM77AVでした。
184  これは、MMUや論理演算・直線補間LSI(ALU)と言った独自デバイスを積んでいて、
185 ALUの基本的なコマンド列は、XM7を参考にしました。
186  Anna氏とたけがみ氏が揉めた最大の理由が、MESSがこの辺りのデバイスの内部
187 記述をXM7から丸パクリした事に対して、Anna氏を通じて抗議したものの、MESS
188 コミュニティからの回答が全く無い。と言う非常にふざけた話に端を発したことで
189 したので、この辺りは他の部分に増して気をつけて書いたつもりです。[18]
190  現状、仕様通りには動くようになっていて、ALUの細かいhackができてないかも…
191 と言う感じのところです(サイオブレードの字の描画とか)。
192  タイミング計算には若干の問題が出てますので、直す機会を伺ってはいます。
193
194 [18] ALUの内部構造で、直線補間機能でC言語の割り算演算を使って書かれてるの
195    は、実はそういう理由からだったりします。
196
197  ここら辺含めて、2ちゃんねるの「昔のPC」板の、PCエミュレータ総合スレに
198 ちょくちょくバイナリを投げてはバグ報告や改善案をスレ住人の皆さんにお聞きする
199 ようになったのも、この辺りからだったと思います。当時はWindowsでは動かなかった
200 のではありますが(後に動かせるようになる)。
201  この作業はなんだかんだで難航してまして、ほとんどのソフトが齟齬なく動くよう
202 になったのが、6月16日前後でした。結局三ヶ月かかってる。[19]
203
204 [19] commit 1b4320ef6229e75013478fe1ec66ed1eb3c47bd5
205
206  次は、FM-77を作りました。これは、そんなに苦しくなく進められました。ただし、
207 現物を持っていないFM-77L4の400ライン部分を諦めることでですが。
208  ただし、ブートシーケンスやメモリマップがFM-7とも77AVとも微妙に違うところは
209 見落としそうになって、後から気がつくこともありました。特にブートRAM周り。
210
211  さて、ここまで来たら、FM77AV40EXのDMACその他を実装することに、必然的になる
212 訳ですが…動くソフトが増えると色々なバグが噴き出してきたり、色々弄らないといけ
213 なくなるので、なんだかんだでここでも数カ月かかりました。
214  この時期の成果の多くが、CSP原作者の武田さんの作業にフィードバックされています。
215  武田さん、本当にありがとうございます m(_ _)m
216
217 …で、9月の14日に、AV40EXもほぼ大丈夫になり[20]、そこからはWindowsへの適用
218 や、全てのVMを移植していくようになる訳です。
219  FM-8はやるやる詐欺をしてしまってますが、いい加減やっていこうと思ってはいます。
220
221 [20] commit bbf5ed7132304d6e4c19da3cb2d634923eb55a5b あたり
222
223  そして、そこからの一ヶ月弱でMinGWを使ってのWindows向けクロス開発環境を構築
224 したり、ライブラリのAPIの違いを吸収し、Win32版もバイナリパッケージになるべく同梱
225 するようにして、武田さんとの2ちゃんねるを経由しての議論を交わしつつ、今に至る
226 訳です。
227
228 5.さいごに
229  CSPも、Qt適用版も、まだまだ進化していきます。私の側から提案するものもあれば、武田
230 さんが提案する物や2ちゃんねるのスレ住人の提案を入れ込んだものもある。
231  こういう、FOSSの醍醐味のようなものをできるというのは、本当にいいなと思います。
232  そして、FM-7系に関しては、特にAV系の検証が甘いのは否定できないので、色々とやってい
233 く事がぱらぱらとあるでしょう。でも、まぁ、マイペースでこれからもやっていきますので、
234 武田さんとユーザの皆様含め、皆様よろしくお願いします m(_ _)m
235
236                                2016 1.1 K.Ohta <whatisthis.sowhat _at_ gmail.com>
237
238 ※追記:
239
240 6.おまけ1:「1/60秒問題」に関して。
241  エミュレータには、「1/60秒問題」と言うのがあります。
242  実際のディスプレイと、エミュレーションするディスプレイの垂直帰線の速度が違うとか
243 タイミング的に同期が取れない場合が多いとか言う理由で、最低でも実際のディスプレイの
244 1フレーム=1/60秒のズレが生じてしまうのをどうするか。と言う話で、このズレを解消する
245 しないで度々議論が起こります。
246  1/60秒以内のズレを売りにしたエミュレータなんかも、ありますよね。
247  私の立場は、「2フレームまではずれても仕方ない」というものです。
248  どういう事かというと、1フレームの遅れは上記のマシンの差から出てくる物で、もう
249 1フレームの遅れは、間にDirect XやOpenGLが挟まることで、「前のフレーム期間に描画した
250 ものを表示することでチラツキをなくす」構造がホストマシンのOS側で普通に用意されていて、
251 そこら辺はアプリケーションから直に触るのが困難な場合があるからです。
252  つまり、最悪で2フレーム程度のズレ(垂直帰線周波数が著しく違う場合はもう少し)は
253 ディスプレィの垂直帰線周波数が違う以上は回避出来ないのを考えていこう。と言う事で。
254  そこまで突っ込むのは通常のアプリケーションがやるものでもないし、OS側の設定で緩和
255 可能な場合もある話ですしね。
256  最終的には、OS側が用意してるVBLANK割込でCSP側も同期させればいいのでしょうけど、
257 そんなことまで考えるのはなんだかなぁ。と、個人的には思うのです。そこら辺は、CSPを
258 基にカスタマイズする方々でやってみてください(多分GLかDirect XかVulkanかでかなり
259 コードが変わるでしょうから…)。GPLv2はそのためにもあるのですよ。などと私は思うの
260 です(^_^;
261
262
263 改定履歴:
264 2016-01-05  2ちゃんねるエミュレータ総合スレでのご指摘を基に、
265       許諾を頂く事実関係の記述を一部見直し。後、6.項を追加。
266  
267 2016-01-07 ↑の板での時分秒プロテクト/フォーマットの表現についての指摘に対して、
268            追記修正した(怖々)
269
270 2016-09-15 しかたないからGoogle翻訳した日本語文章をABOUT_eFM7_1.en.txtとして追加。
271            ま だ 語 句 校 正 な ど 全 く や っ て ま せ ん
272