PC-6601SR版 Ys2 オープニングの作り方(0)
そもそも、作り出すきっかけは、タイニー野郎さんの、PC-6001版に触発されたからです。
昔から、iP6 Plus というエミュレータ を作っていたこともあって、PC-6601SRのことについては、それなりに詳しかったというのも大きいです。
でも、まさか、本当にここまで来るとは思ってませんでした。
タイニー野郎さんには、音楽をお借りして、しかも、作り方まで伝授頂き、本当にありがとうございました。(_)
それでは、PC-6601SRのスペックについて、おさらいしましょう。
CPU | Z80 互換 |
メインメモリー | 64KB |
グラフィックス | 320x200ドット15色表示 (★こっちを使用) |
グラフィックス | |
グラフィックス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とらなくてもいいというメリットがありますが。。それぐらいですね。(^^;;;
なんせ、扱いづらいです。_ノ乙(、ン、)_