私には、一つの夢がありました。それは、いつか P6エミュレータで SR特有の機能が動き出すことです。 でも、長い間 実現されることはありませんでした。
しかし、ここで私に転機をもたらしたのは、やはり Unix版の iP6のソースコードに触れたからですね。(^^; プリントアウトして、何回も眺めているうちに、もしかすると、改造すれば SR特有の機能も動くのでは? と思い出しました。 そうなると、いてもたってもいられなくなり、改造に没頭していくことになります。(^^;
最初の頃は、iP6にはさわらずに、独立したプログラムで、PC-6601SRの起動メニュー画面を 作っていました。(^^; と言っても、BIOSを解読して作ったわけではなく、なんと実機の起動直後に残っていたデータを使うという 一風変わった方法でした。(汗)
単純に、SR BASIC を起動直後に VRAMの内容を 1DDフロッピィにBSAVEしたデータを抜き出して使っていました。だから、右端に縦線が入っています。 ちなみに、この縦線は、ページ2が、テキストモードで初期化されたせいです。
でも、この方法、簡単そうに見えて、実は難しかったんですね。 何度やっても、絵が出ないので、仕方なく、実機でテストしてみると、VRAMが、すごい並び方になっていました。(汗)
説明すると長くなるんですが、まず320X200の画面を 左256ドット 右64ドットになるように切ります。 左側の開始アドレスは、1A00Hです。右は0000Hです。 VRAMの中身は、1ワードごとに4ドット分の内容が格納されています。 ここで注意しなければならないのは、奇数ラインと偶数ラインが交互に出てくると言うことです。
その並び方通りに Delphiでプログラムして、なんとか画面が出たので、一部で公開しました。 もちろん、その並び方は、iP6の 改造でも利用することになります。 それにしても、C言語使いなのに、何故 Object Pascal のDelphiなの? というのは、謎だったり。(汗)
ちなみに、色は適当です。 それから、右側の並び方がちょっとおかしいです。
こうなってくると、なんとか、PC-6001のエミュレータで、SR BASIC を動かしたくなります。 ありがたいことに、Unix版のiP6 のソースリストは すべて公開されていますので、これを利用させてもらうことにしました。(^^; ここからは、FreeBSD + gccで開発します。
おおまかにいって、修正が必要なのは、画面まわりと、I/O周りと、メモリーマップと、初めに ROMを読みにいくように初期化するところです。 でも、初めは、絵が出ればいいかな? ぐらいに思っていました。 それで、開発が始まります。
とりあえず上記の絵を出すだけの プログラムを ip6 に組み込んで見ました。 MODE 5で起動して、SCREEN 4,2,2として、おもむろにページをめくると、上記の画面が出てきます。(汗) ただ、それだけのことですが、結構どきどきしましたね。(^^;
つぎに、いよいよ本当に改造を始めます。I/O周りを軽く実装して、 ROMを配置して、0番地から実行を開始・・。まだまだ Z80が命令を実行している という段階ですが。
なんども Segment Fault やバグに悩まされました。やっぱり、改造をしたところが、バグだらけでした。 でも、iP6には、デバッグモードがありますし、昔ながらのprintfでデバッグプリントが出来るので、がしがし バグをつぶしていきました。(^^;
さらに ROM を実行させると、無限ループに陥っていってしまい、止まってしまいました。 正確に言うと、CRT関係の割り込み処理が終わるのを待っている様でした。 そのときは、よく分からなかったので、強制的に loopから抜け出すように ROM にパッチを当てるように、プログラムを変更しました。
(あとから分かったのですが、この CRT関係の割り込み処理というのは、垂直同期の割り込みのようです。)
しばらくいくと、プログラムカウンタ的にいって、メニュー画面でファンクションキーの入力待ちになっているようです。このときになって、初めて、SCREEN 1の表示ルーチンを実装。といっても、ただ単に、N66 BASIC の SCREEN1の表示ルーチンから コピーしてきただけですが・・。(^^;;
そうすると、なんと、テキスト画面が表示されだしました。(^^; といっても、文字が一足とばしで、表示されるんですけど・・。(;_; よくよく考えると、N66SR BASIC と、N66 BASIC では、テキスト画面のVRAM構成が変わっていました。SR BASICでは、文字コードと、属性が交互になりますので、これを修正。
再度起動すると、黒いテキスト画面で 下にファンクションキーの白いのが 5つ並んでいる画面でとまりました。ここで、F5を押すと、なんといきなり N66SR-BASIC が起動。
まさか動くとは 夢にも思ってなかったので、あぜんとなりました。(^^;
ふるえる手で、COLOR 5 とかやってみて、色が変わることを確認したり、BASICのプログラムを入力して、RUN したり・・。
なんでここまで動くのでしょう? でも、正直な話、修正がこの程度で済んだから、動いたのだと思います。(汗) 他にも、割り込みとか、キー入力とかが絡まってきていたら、お手上げだったと思います・・。
でも、この時点では グラフィック画面はまだです。
でも、よく見ると、フォントがおかしいですよねぇ・・。(^^; これは、テキスト表示ルーチンが おかしかったようです。 何故か、N60 BASICのフォントを使用していました。
でも、何度ページを切り替えようとしても、切り替わらないことに気づく。 そうなんです。ページ2が表示できないんです。(汗) このままでは、グラフィック画面も表示できないことになってしまいます。
これは、最初の頃、CRT関係の割り込み処理を待っていた箇所が関係していることが分かりました。
ページなどが切り替わるときは、
回りくどいことをやっていますが、おそらく、画面がちらつかないようにするためだと思われます。 しかし、この時点で、割り込みの実装なんて、まだ無理だと思ったため、無理矢理 パッチでごまかしました。
メインルーチンの方で 割り込みを待たないで、直接その割り込みルーチンを CALLしてしまうという、かなり強引な方法でした。(汗) このときは、CD 30 10 というパッチを当てていました。
やっとグラフィック画面が表示された・・・とはいっても、画面の上の方で、一行だけチカチカと明滅するという画面です。 ここまで来てから、SCREEN2の実装を始めます。これが、一番の難産でした。
今までのPC-6601までの VRAMというと、一旦RAMに切り替えれば、あとはCPUからアクセスし放題だったし、並び方も単純だったのですが、その常識は全て覆ってしまいます。 SR BASICのVRAMは、1ラインづつしかアクセスできません。一種のバンク切り替えです。
VRAMアクセスと、そのVRAMを読み出して表示するルーチンの二つも作る必要があります。もちろん、VRAMアクセスの方がバグっていれば、表示するルーチンが正しくても、正しく表示されなくなってしまいます。
だんだん、それっぽくなるんだけど、なかなか 磨りガラス状態から、抜け出せ無いなぁ・・と思っていたら、ワードアクセスしないと行けないことを、忘れていたので、即 修正。
やっとのことで、グラフィック画面が出ました。このときが、二度目の感激ですね。(^^;
一応は動くようになったと判断して、ソースリストを、ishioさんに提供して、一部でスナップショットを公開しました。
といっても、見ての通り グラフィック画面で、テキスト文字が表示できな かったりしますが・・。(^^;;;;
この時点(2月17日)で判明していたバグと TO DO は、下記の通りです。
一区切りつきましたが、まだやることが いっぱいあります。(^^; まだまだ、続きが有りますが、それは後日のお楽しみと言うことで・・。
まだテキスト画面のフォントがおかしかったり、グラフィック画面でテキスト文字が表示できないと言うバグが残ったままでした。
あと、どうやっても、グラフィック画面で、非漢字文字の !”#$%&などが 正しく表示できないことに気づきました。
saver2 でSRの CGROM が正しく読み込めないと言うバグがあって、それが関係しているようです。 しかし、isioさんによると SRで saver1で取得できる CGROM60と CGROM66 で代用できるので、それを使えば問題がないようです。
まぁ、CGROMは 今までのように、別々になっていた方が何かと便利なので、CGROM60と、CGROM66で代用することにします。 ちなみに、このエミュレータのSRモードでは、CGROMを読み込んだあと、メモリー上でCGROM60と CGROM66を結合することにしました。
ようやく、SRの起動メニューの正式版ですね。
本来なら、このぐらいに、フロッピィドライブの実装をしているんですが、 とっても長くなるので、別ファイルにする予定です。(_) 申し訳ございません。
これは不思議なバグです。SCREEN 2,2,1とやるとおかしくなります。(^^; もうどうやっても、テキスト文字のフォントが表示されなくなります。(汗) もちろん、エミュレータを再起動すれば治るんですが・・。 これは、全然分からないため、ほったらかしにしていましたが、ついに分かりました。(^^;
I/Oの C9HでTEXT VRAMのアドレスを変更していますが、CRTコントローラが ビットマップモードになっている(I/Oの C8Hのb3が0)時、TEXT VRAMのアドレスを変更してはいけないようですね。(汗)
まぁ、当然といえば当然かもしれませんが・・。そういうふうに変更すると、治りました。(^^;
PC-6601SRと、PC-6001mk2SRとは、一部搭載されているハードウエアに違いがありますが、Mr.PCテクニカルコレクションによると、搭載されているROMは同じみたいですね。(^^; ということは、PC-6601SRの ROMでも、PC-6001mk2SRのエミュレートが出来るようです。 逆も然りかも?
それなら、いちいち PC-6601SR と PC-6001mk2SR で ROMの名前を分ける必要はないのかも知れません。(汗) ただ、もしかすると違う奴があるかもしれないので、別々になっていると思われます。
そういうわけで、PC-6001mk2SR として動かした画面です。 エミュレートする上で変えているのは、機種チェックで返却する値と、ディスクのタイプです。
というわけで、改造日記 2に続きます。(^^; ここまで読んで頂いて、ありがとうございました。