スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

3月14日 伝えて そのまま ためらわないで


さて、次はSCREEN 2の……




え~~、まだやるの?




ごめん、MSX1のVRAM探訪はこれで最後にします。で、SCREEN 2はグラフィックモードで、256×192ドットの表示が出来ます。そのかわり、文字は「文字」としては表示できません。すべてグラフィック扱いになります。




PC-9801だと、1ドット=1ビットで、640×400ドットで32KB。それが赤青緑3枚(16色だと4枚)ぶん用意されている……っていうおなじみの配列ですけど、MSXはどうなんでしょう。




実は、先週説明したSCREEN 1と使い方は同じです。




そうなの?グラフィックなら、パターンネームテーブルっていらないと思うんですけど。あれって8×8ドットの文字単位の管理しかできないじゃないですか。




そうなんだけど、統一性を持たせる為なのか、そうなってます。簡単に言うと、文字を表示する時とは逆のことをしているという。




逆?




先週のSCREEN 1では、パターンジェネレーターテーブルに文字の形の情報があらかじめ格納されていました。例えばキャラクター番号65番は"A"、66番は"B"とかいうふうに。で、パターンネームテーブルにその番号を書き込むと、文字が表示されるという仕組みでした。ネームテーブルの先頭に"65"を書き込むと画面左隅に"A"と表示されるよね。




はいはい。




グラフィックモードの場合、パターンジェネレーターテーブルには初めは何もデータがありません。そして、パターンネームテーブルには、あらかじめキャラクタ番号の0~255が整然と並んだ状態になっています。




なるほど、なんとなくわかってきました。




BASICでグラフィックを描く命令、PSETとかLINEなどを実行すると、データが書き込まれるのはSCREEN 1の時とは違い、パターンジェネレーターテーブルの方になります。




例えば、画面左隅に点を打つPSET(0,0)を実行すると、キャラクタ番号0番の所にデータが書き込まれます。




そうすると、あらかじめパターンネームテーブルにある0番のところに点が現れるわけですね。




そうそう。ネームテーブルの方を操作するSCREEN 1、ジェネレーターテーブルの方を操作するSCREEN 2、という感じです。全画面をユーザー定義文字で書き換えているという言い方もできるかも。だから基本は、8×8ドットをひとつの単位とした文字画面と変わりません。




でも、文字画面は32桁×24行で768文字ぶんありますよ。1バイト、256文字ぶんでは全画面を別々のキャラクタで埋めることが出来ませんよ。




なので、このモードでは画面を上中下、三分割して管理しています。ちょうど8行ぶんずつ。32桁×8行でちょうどこの領域は256文字ぶんになります。




なるほど。ということは、同じキャラクタ番号でも、場所が違えば表示される内容が違うということですね。




そう。例えば、8×8ドットでこんなグラフィックを描いてみたとします。



三色アイス


三色アイス?SCREEN 1の時と違ってずいぶんカラフルですね。




SCREEN 2では、水平方向8ドット中に15色の中から2色、という制限がありますが、垂直方向にはそういう制限がないので、SCREEN 1の時よりも表現力が上がります。これみたいに水平方向にあまり変化がない絵なんかはきれいになりますね。




で、これがキャラクタ番号0番、ということなので、パターンネームテーブルに0番を敷き詰めれば、このキャラクタで画面が埋まることになるのですが……



三色アイス敷き詰め


あ、上8行ぶんしか表示されませんね。なるほどなるほど……




先ほど説明したように、「0番」は上中下のエリアでそれぞれ別になっているので、こうなってしまうのです。




三色アイスですべてを埋めるには、上中下を担当するそれぞれのパターンジェネレーターテーブルに同じ内容を記録する必要があります。この場合でいうと、三色アイスデータを0H、800H、1000Hに書き込めばすべての場所で「0番が三色アイス」になります。




なんか、前と同じ使い方ができそうですね。しかも色がたくさん使えるし。




ということで、こんなプログラムを。ゲームには全然なってませんが、カーソルキーで人が動くものを作ってみました。グラフィックモードといいながら、動かしているデータは文字の時と同じネームテーブル上のものなので、動きの速度は文字の時と同じです。



SCREEN 2 ゲーム画面


先週より、よりカラフルになりましたね。




ただ、画面に表示するものを全部自分で管理しないといけないので大変かなあとは思う。BASICの命令で画面に書き込んじゃうとパターンジェネレーターテーブルが壊れちゃうし。




さて、MSXのVRAM探訪をしてきましたが、どうでした?




実は、「MSX-BASICには、N88-BASICにあるGET@、PUT@にあたる命令はないの?」っていうのが事の発端で。




グラフィックの表示をする命令ですか。




うん。どうも見あたらない、しかし速度的にもデータ的にもPSETやLINEで描いているわけにもいかない、だったらVRAMの内容をそのまま取り込めばいいんじゃないか、と考えて。




なるほどね。まあ目的は達せられたんじゃないの。




でも、MSX1というハードと、BASICのみで作るというのを考えると、そこまでするよりもっと手軽にスプライトで作って下さい、というメッセージなのかなと。そういう命令がないのは。




そもそも、水平方向8ドットにつき2色だと、制限がきつすぎて小さなキャラクタの顔とか描くのは厳しそうですし。あと、VRAMへのまとまったデータの書き込みは結構時間かかりますよ。先ほどのプログラムの動作を見ても。素直にPSETやDRAWとか使った方がスマートかと。




……ということに気がついた、VRAM探訪でした。




牧野すずめ

コメントの投稿

非公開コメント

カレンダー
04 | 2017/05 | 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
twitterでひとこと
最新記事
リンク
カテゴリ
最新コメント
最新トラックバック
検索フォーム
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
来訪者数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。