PC-6601SR版 Ys2 オープニングの作り方(0)

そもそも、作り出すきっかけは、タイニー野郎さんの、PC-6001版に触発されたからです。
昔から、iP6 Plus というエミュレータ を作っていたこともあって、PC-6601SRのことについては、それなりに詳しかったというのも大きいです。
でも、まさか、本当にここまで来るとは思ってませんでした。


タイニー野郎さんには、音楽をお借りして、しかも、作り方まで伝授頂き、本当にありがとうございました。(_)


それでは、PC-6601SRのスペックについて、おさらいしましょう。

CPU Z80 互換
メインメモリー 64KB
グラフィックス  320x200ドット15色表示 (★こっちを使用)
グラフィックス  640x200ドット 4色表示
グラフィックスVRAM 32KB (メインメモリー の一部を使用)
ハードウエアスクロール 有り
パレット 有り (4色のみ変更可能)
テキスト画面 40x20文字等 (グラフィックスと重ね合わせ不可)


という感じです。
モリーの単位は、ギガでも、メガでもなく、キロバイトです。。(゚д゚)!

モリーが 64KBなのに、なぜか、VRAMが半分の 32KBも、持って行ってしまいます。使えるのは、32KBしか有りません。Σ(・∀・;)


PC-6001系は、メインメモリーに、VRAMが配置されているので、VRAMの大きさによって、使えるメモリーが制限をうけてしまいます。



グラフィックスも、細かくなって、色数も増えています。
PC-6001は4色でしたが、PC-6601SRは、15色になっているので、画面がきれいになる代わりに、単純計算で、2倍以上のデータが必要になってしまいました。



この辺に、SRの設計上の無理があると思われます。
PC-6601SRでも、320x200ドット 15色中4色モード(16KBしか消費しない)があれば、もうちょっとゲームも作りやすかったと思われますが。。


若しくは、320x200ドット 15色中15色モードで、88みたいに、プレーン方式にして、VRAMをバンク切り替えで切り替えるようにしてしまうんです。
あと、4プレーン同時アクセス可能にして。テキスト画面を重ね合わせも。。
そこまですると、かなり、コストがかかったかも知れませんが。。汗



元データは、大方の予想通り、PC-88版のYs2OPから、頂いています。
PC-88は、640x400ドット 512色中8色表示です。
(正確には、640x200ドットですが、見た目上は、640x400です)

ということは、ちょうど、解像度を半分にして、15色に減色したら、それなりに見える絵になると思われます。
(実際には、細かく書き込まれている絵などは、修正が必要だったりしましたが。。)

モリーについて

モリーマップは、

0000h グラフィックス VRAM  (32KB)
8000h メインPG  (1KB)
8381h (サブ部)サブPG ・グラフィックスデータ (約23KB)
E000h ワークエリア・スタックポインタ (4KB)
F000h PSG音源ドライバー・音楽データ (テキストVRAM )  (4KB)

という感じです。


少しでも、メモリーを確保するために、テキスト用VRAMに、PSG音源ドライバーと、音楽データを 入れることにしました。
あと、BIOS ROMルーチンを使うので、ワークエリアもよけないといけません。

これで、音楽を除いた、視覚的なプログラムやデータに使えるのが、24KBになりました (;´∀`)


その代わり、テキスト画面に切り替えることが出来なくなったので、テキスト画面で、「暗転させる。」ということができなくなってしまいました。


Ys2のタイトル画面が表示されるときに、ディスクから読み込む過程が見えてしまうのは、そういう理由です。。


どう考えても、少なすぎますね。。この規模のマシンだと、最低でも2倍の48KBは必要だと思うのですが。。??



メインPGは、メインの処理を司るところで、常駐しています。グラフィックス展開ルーチンや、サブPG読み込みルーチンなどが入っています。
サブPGは、グラフィックスデータがおいてあって、シーンごとのグラフィックスを描画指示したりする部分です。

FM音源じゃない理由

モリーが足りないからです。ただ、これについては、まだ限界を突破してないという話もあるので、プログラム次第。。
という話もあります。。


もしかすると、拡張メモリーを使うように、PGを変更すれば、可能かもしれませんが。。。??

拡張メモリー

実を言うと、オプションで、拡張メモリー64KBというのがあります。
これを拡張すると、なんと、拡張メモリー64KBが増えてしまうのです。。( ´ ▽ ` )ノ


でも、これには、欠点があります。バンク切り替えしないと行けないのです。。
タダでさえ少ないメインメモリーを、バンク切り替え用のウインドウを用意しないと行けなく、しかも、プログラムが複雑になります。
(バンク境界をまたぐときが、かなり、やっかいです。。)


あと、あまり普及してないので、実機では持っている人が少ないという欠点もあります。(エミュレータでは誰でも使えますが)


今回は、メインメモリーだけでなんとかなったので、使いませんでした。


後から考えると、使える環境なら、使っても良かったのでは?
と思いましたが。。
でも、プログラムが難しくなるんですよねぇ。。(^^;;


パレット

PC-6601SRでは、パレット機能で、色を瞬時に変更できます。
これが使えると、演出上かなり楽になります。
ただし、制限があって、15色あるのに、4色しか変更できません。
絵によっては、かなり制限が加わります。


たとえば、色の変わるところが、5色だと、対応不可です。
使われている色数が5色でも、色が変化するのが4色だと、なんとか対応出来ますが。。(^^;;

そういう場面が、結構ありました。


88と違って、テキスト画面で隠せない!

このため、グラフィックスVRAMの隙間に書いておいて、転送するだけ。。ということが出来ません。
これができれば、かなり、メモリーが節約できるんですけど。。

表示するデータは、全て、VRAM以外のフリーエリアに置いておかないと行けないのです。
フリーエリアの、24KBに、如何におさめるかが、鍵になります。

グラフィックスVRAMへのアクセスの方法

PC-6601SRは、かなり、かわっていて、指定したY座標の、横方向1ラインづつしか、アクセスできません。
CRTCを経由してしか、アクセスできないのでしょう。


I/Oポートに、アクセスしたいY座標を出力すると、メモリーの、0000H-027FH に、そのラインのVRAMのイメージが現れるので、そこに対して、読み書きするしか有りません。


そして、色は、パックドピクセル方式なので、1ドット=1バイトです。


その割には、VRAM のメモリー自体は、メインメモリーなので、メインメモリーを32KBも持って行ってしまいます。(^^;;
専用のVRAMメモリーを持っていても、良さそうだけど。。??


こんな方式なので、かなり大変です。
VRAMに高速に書き込もうとしても、間にI/Oポート書き込みが挟まるので、限界があります。読み込みするときは、ROM → RAM に切り替えないと行けませんし。。


プレーン分割で、多重スクロールという手も使えません。


あと、今回は使ってませんが、縦方向のソフトウエアスクロールが、とてつもなく遅くなります。
普通のVRAMなら、転送元から、転送先にメモリー転送するだけで終わりですが、

  • 転送元にY座標指定
  • 転送元からデータを読み込み
  • データをテンポラリーに保存
  • 転送先にY座標を変える。
  • テンポラリーから、転送先に、再度書き込む

という方法しかないです。


まぁ、メリットは若干あって、面倒なVRAMのアドレス計算をしなくてもいい。
キャラクターの合成時は、いちいちマスクとANDとらなくてもいいというメリットがありますが。。それぐらいですね。(^^;;;
なんせ、扱いづらいです。_ノ乙(、ン、)_