PC-6601SRで、Ys2 OPの作り方

今までは、メインメモリーだけでなんとかやってましたが、拡張メモリー (64KB) を使うようにしました。

これで、原理的には、何でもありになります。。
というか、今までが、今まで過ぎただけで、これぐらいが、普通という感じだと思いますが。。。汗


今まで、何故、拡張メモリーを使わなかったか?ということですが、実機でテスト出来ないことが、大きかったですね。。しかし、それも、解決しそうな感じが見えてきました。


今までだと、メインメモリー 大容量64KBのうち、グラフィックスVRAMとして、32KBも持って行かれて、プログラムとデータを入れるところが、約24KBしかないという、理不尽さでしたから。。(^^;


今のところは、早く実現するために、なるべく今までのプログラムは変えないようにしています。すぐには、いじらない場面もありますしね。。

将来的には、FM音源も視野に? 多分、今世紀中に出来れば、いいでしょうか。。(;・∀・)


「これ以上、何を望むのか?」「FM音源を望む!」 |彡サッ 

ビットマップ無効モード

あと、高速化のために、ビットマップ無効モードも使っています。今までは、ビットマップ有効モードしか使ってませんでした。


有効モードだと、アクセスしたいY座標を、I/Oポートに出力すると、そのラインのX座標0から319のVRAMが、メモリー上に出来た、ウインドウに投影されるので、そのウインドウに対して、アクセスすれば、VRAMが書き換わるというものです。(つまり、1ラインずつしかアクセスできない)


今までは、1バイトが4つに分割されていて、2ビット=1ドットに割り当てられていて、1だと光っている、0だと光ってない。のデータが、順番に並んでいるだけだったのに、どうしてこんな事になってしまったのだろう?


1ドット=1バイトのパックドピクセルになっていますが、P6は、15色表示なので、4ビットしか使いません。パックドピクセルでデータを保存していると、当たり前ですが、データが2倍にふくれあがるので、いちいち、上位と下位にデータを押し込んでおいて、それをシフト命令などでいちいち取り出してから、VRAMウインドウに書き込むとかやってました。それだけでも、相当遅くなります。



無効モードだと、すっごく変な並び方(?)の代わりに、LDIRなどで転送出来るので、すっごく速くなります。
変な並び方は、詳しくは、リンク先を参照してほしいのですが、簡単に言うと、1ワード分のデータが来たら、次の1ワード分のデータは、一つ下のY座標のデータが来る。。の繰り返しで、何故か、X座標 0−255と、256−319で、左右に分かれている。という、鬼畜仕様で、まさしく、どうしてこうなったの? という感じでした。


有効モードでも、無効モードでも、ソフトウエアの縦スクロールは原理上、かなり遅くなってしまうと思います。。。Ys2 OPにソフトウエア縦スクロールが無くて良かったです。(^^;

絵を保存する

88エミュレータのグラフィックスを拝借しています。その絵を、PaintShop Pro 7という、グラフィックスエディターで、解像度を半分にして、16色に減色します。
何故、PainShop Pro 7 なのかというと、いい感じに、解像度を半分に出来るからです。
Photoshop だと、こうはいきませんし、何故か、Photoshop で保存した絵は、P6エミュで読み込ませると、色が変わる? という問題がありました。


一度 PC-6601SR エミュレータの画面に絵を表示させて、ビットマップ無効モードにしてから、拡張メモリーに保存するプログラムを書いて、保存しました。画面に表示するときも、拡張メモリーから、LDIRするだけなので、かなり高速に書き換えできます。


(ここだけの話、速すぎるので、垂直同期でタイミングを取ら無いと、視認できないほどです。)

ビットマップ無効モードの並び方が右と左で違う問題

しかし、それでも許してくれず、この無効モードはもう一つのおかしな仕様が有り、それでも我らを、苦しめてくれます。それは、X座標(0〜255)までと、(256〜319)までの並び方が、違うことです。 Σ(゚д゚lll)ガーン


あまり覚えてませんが、確か、左側は、まだ順番通りなのに対して、右側は、あっちこっち飛んでいたと思います。まさしくどうしてこうなった? と言う感じですが。。PC-6601SR のディスプレイコントーラーはどういう仕様だったのでしょうか?


256ドットから右の絵をセーブするときは、そのままでは、セーブできないことに、気づきます。


そういうときは、下記のようなBASICプログラムを書いて、いちいち、絵を左側に移動してから、絵を保存していました。


10 SCREEN 2,2,2
20 FOR Y=150 TO 200
30 FOR X=256 TO 319
40 A = POINT(X,Y)
50 PSET(X-256,Y),A
60 NEXT
70 NEXT