Ys2 OP を、PC-6601SR のエミュレータで作ってみた。 Ver.6 Beta 2


久しぶりに、いじっています。
Ver.5 までは、メインメモリーだけでやっていたので、無理があるところが多々あったのですが、拡張メモリーを使うようになって、かなり改善されました。



よーーーく見ると、まだバグが有りますね。。
うーん。

Ys2 OP タイトル画面 

 今までは、32KBのVRAMをそのまま、ディスクに書き込んでおいて、読み込むだけだったので、読み込みに時間がかかり、書いている経過が見えてしまい、萎えていました。


PC-6601SRは、グラフィックス画面を単体で非表示にする機能がありません。15色同時表示出来るのに、パレットは、何故か4色分しか変更出来ないという、理不尽さで全部黒に設定出来ないので無理。テキスト画面を真っ黒にしておいて、一時的にそれに切り替える方法しかありませんが、今のところ、テキストVRAMは音楽で使用中です。


今は、圧縮と、拡張RAMを使っていて、ほぼ瞬間的に表示出来るようになりました。

  1. エミュレータで、VRAMの内容をそのまま保存します。
  2. 1.のデータをWindows上で圧縮します。
  3. アセンブラリストに、incbin で2.のデータをひっつけます。
  4. 3.を、展開ルーチンで拡張メモリーに展開します。
  5. 拡張メモリーにあるデータを、LDIR でVRAMに転送します。


圧縮すると、32KBのデータが、12KBになりました。でも、P6上で展開するのに、6秒もかかります。


PC-6601SRは、ディスクがついているので、何でもできるとはいうものの、ディスクからの読み込みは、結構遅いので、データが多いと、読み込み時間が長ったらしくなってしまいます。


ただ、32KB ディスクから読み込むのが早いか、12KB ディスクから読み込んでから、展開する方が早いか? ですが。。。?銅なんだろう?

ただ、ディスクはなるべく節約しないと行けないですしね。。。




そういえば、88版のイース2 OP をエミュレータで見てみると、結構待ち時間が有るんですよね。
本当に時間がかかっている部分も有ると思いますが、あまり、早くやり過ぎると、全体的に前のめりになり、音楽と同時に終われない。というのも有ります。


ちなみに、88実機で実行すると、最後のクレジットとほぼ同時に音楽も終わっていて気持ちがいいのですが、88エミュレータを撮影した動画だと、前のめりに終わってしまい、音楽だけが余ってしまっているのが、多いと思います。
おそらく、エミュレータだと、ディスクからの読み込みが早く終わってしまうからだと思われます。

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