[ AMIDER(アミダー) その10 ]

※途中で戻りたい場合は、ブラウザの「戻る」機能を使ってください。

プログラムリストの意味を解析 第1ブロック(100行〜280行)



変数の意味

このブロックで出てくる変数は、I AD A$ B$

I はREAD文で繰り返しを行う時の添え字の変数として使われています。

AD は120行で&H1800が代入されている事から、アドレスを表していると考えられます。

因みに、&H1800番地はどんなアドレスかと調べてみると、パターン名称テーブル(&H18000〜&H1AFF)の始まりのアドレスらしいです。

このパターン名称テーブルとはどんな領域なのかというと、「画面のどこにどんな文字が表示されているか」の情報が書き込まれているそうです。

A$とB$はスプライトパターン定義に使われています(130行と140行)。

定義方法は、「AMIDER その3」にて解説してありますので、参照してください。


スプライトパターンの確認

確認の為に100行から280行だけを実行させて、その結果を表示してみたいと思います。

DELETE 290-1010

として、このブロック以外のリストを消しておき、その結果を表示させる為に290行を追加します。

290 PUTSPRITE 0,(128,100),15,0

これで、座標(128,100)にスプライトパターン番号0、白色(15)でスプライト番号0を表示してみます。

以下がリストです。



実行結果です。

画面真ん中あたりに、エイリアンの絵が現れました!!



拡大してみました。



このことから、スプライトパターン番号0には、エイリアンのパターンが記録された事がわかりました。

次に、290行のスプライトパターン面番号を0から1に書き変えて実行してみましょう。

リストです(パラメーターの最後の部分が、0から1に変わっている事を確認してください)。



実行結果です。

先程とは違ったエイリアンのパターンが表示されました。



拡大してみます。

触覚と足(?)が違う形になっているのがわかるでしょうか?



これで、スプライトパターン番号1には、エイリアンのもう1つのパターンが記録されている事がわかりました。

今度はスプライトパターン番号を1から2に書き変えて実行してみましょう。

リストです(パラメーターの最後の部分が、1から2に変わっている事を確認してください)。



実行結果です。

マイキャラクタであるロープのパターンが表示されました(パラメータにより、白色になっていますが)。



拡大してみます。



これで、スプライトパターン番号2には、マイキャラクタのロープのパターンが記録されている事がわかりました。

このあと、スプライトパターン番号を3にしてみましたが、なにも表示されませんでした。

つまりスプライトパターン番号は、130行と140行で定義した通り、0〜2まで定義されている事になります。

130行で190行のDATA文を読み込み、スプライトパターン番号0に登録と、200行のDATA文を読み込み、スプライトパターン番号1に登録。

140行で210行のDATA文を読み込み、スプライトパターン番号2に登録。

その結果が、先程表示したスプライトパターンとなります。


キャラクタパターンの確認

150行から170行までは、アドレスを使ってキャラクターパターンジェネレーターテーブル(&H0000〜&H07FF)にDATA文で書かれた情報を書き込んでいます。

では、どのように変わったのか確認してみましょう。

DELETE 290-1010

として、このブロック以外のリストを消しておき、その結果を表示させる為に以下のプログラムを追加しました。

サブルーチンとして呼んで実行できるように290行から付け加え、最後にRETURN文を記述しました。



CHR$を使って、すべての文字パターンを表示するプログラムです。

これを、パターン名称テーブルを書き換える前と後に呼び出して比べたら、どこをどの様に書き換えたのかがわかると思ったのです。

区切りがわかるように、350行に改行を二回入れています(PRINT文)。


110行の最後にコロンでつなげて呼び出します(書き込み前のパターンデータを表示)。




280行のアポストロフィーだけの行を書き換えて呼び出し、最後にENDで終わらせます(書き込み後のパターンデータを表示)。




それでは、実行してみましょう。

まず、書き込み前のパターンデータが表示されます。




少し間があり(書き込んでいる時間)、続いて書き込み後の文字パターンを表示されます。



一部の色と文字が書き換わっているのがわかります。

初めに表示したものも、同時に書き換わってしまいました(もとのデータが書き換わっているのだから、考えてみれば当たり前ですよね)。

この二つの実行結果の写真を見比べてみると、

ひらがなの「あ い う え」が書き換わり、「き」までが黄色になっています。

また、ひらがなの「く」が書き換わり、「そ」までが青色になっています。

そして、ひらがなの「た」が書き換わり、「ぬ」までがピンク色になっています。

文字は7個、色は3色変わっている事がわかりました。


資料をもとに実験してみる


ここでVRAMの情報を調べてみました。

雑誌MSX-FANの連載コーナー「Super Biginner's講座」に紹介されていましたので、参考にしてみました。

いわゆる、「文字や記号をどう表現するか」のしくみなのですが、画面に表示されている文字や記号のキャラクタは、

・どんなパターンを

・どこに

・何色で

表示しているかの情報が必要になります。

「どんなパターンを」の情報は、「キャラクタパターンジェネレータテーブル」に書き込むことで実現します。

アドレスは&H0000〜&H07FFで、2048バイトの領域になります。

1キャラクタが8バイトで表現されている為、256キャラクタ分となります。

「どこに」の情報は、「パターン名称テーブル」という領域に書き込みます。

アドレスは&H1800〜&H1AFFで、768バイトの領域になります。

横32キャラクタX縦24キャラクタで1バイト/1キャラクタだから、768バイトとなります。

左上から右へ順番に並び、一番右まで行くと次は1行下の一番左からと言う順番で並んでいます。

「何色で」の情報は、「カラーテーブル」という領域に書き込みます。

アドレスは&H2000〜&H201Fで、8文字ごとにキャラクタの色と背景の色を1バイトで指定し(上位4ビットがキャラクタの色で、下位4ビットが背景の色)、256キャラクタあるため32バイトとなります。

文章ではなかなか説明するのが難しいので、実際にプログラムを見て試して実行してみれば、わかりやすいと思います。

例えば、先程の100行から280行のブロックだけを実行させるとして、

DELETE 290-1010

そしてMSX-FANで知った、キャラクタを表示させるプログラムリストを290行に追加しました。



CHR$()を使ったものよりも、シンプルに出来ます。

実行してみました。



先程の表示例と順番が違っているのに注意してください(グラフィックキャラクタが先に表示されています)。

ここで、150行のFOR文のパラメーターをいじって違いを見てみます。

「FOR I=&H488 TO &H4A7」を「FOR I=&H000 TO &H01F」と変えてみました。

&H488から&H4A7はちょうど32回行う為、&H000からだと&H01Fとなります。

リスト表示すると、頭の0は省略されるようですね。



そして実行してみます。



先程の実行例と見比べてみてください。

黄色で表示されていた、ロープのパターンが先頭に移動しました!!

&H0000から始めた為、キャラクタが先頭から変わったのです。

今度は160行を変えて、先程変えたパターンの後に続けて表示してみましょう。

「FOR I=&H4C0 TO &H4C7」を「FOR I=&H020 TO &H027」と変えてみました。

&H4C0から&H4C7はちょうど8回行う為、&H020からだと&H027となります。



実行してみました。



先程の実行例と見比べてみると、青で表示されていたレンガが、先程表示させたロープのパターンのすぐ後に表示されました!!

今度はピンクで表示されている玉のパターンをその後に表示させて見ます。

170行の 「FOR I=&H700 TO &H707」を「FOR I=&H020 TO &H027」と変えてみました。

&H700から&H707はちょうど8回行う為、&H028からだと&H02Fとなります。



実行してみましょう。



レンガの後に玉のパターンが表示されました。

次はこの3色の色の定義を解析してみます。

180行のアドレスを変えてみましょう。

最初の&H2012を&H2000、&H2013を&H2001、&H201Cを&H2002に変えてみます。





黄色、青色、ピンクと8文字ごとに色が変わっています。

こんどは、これに色情報である1倍との上位4ビットと下位4ビットを入れ替えてみました。

&HA1は&H1Aに、&H41は&H14に、&HD1は&H1Dに変えてみました。



実行してみました。



文字色と背景色が反転しています。

キャラクタの色の定義もわかりました。

この実験で、150行はロープのパターン定義、160行はブロックのパターン定義、170行は玉のパターン定期をしていて、ロープのパターンデータは220行から250行、ブロックのパターンデータは260行、玉のパターンデータは270行ということもわかりました。

 

Copyright(C) 2006. ピコピコテクノロジー All Right Reserved.