[ ICE-MAN(アイスマン) その4 ]

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



50行目〜60行目(途中)



50行からの解析ですが、命令がまたいでいる為、50行と60行となります。




まず始めにVPOKE文でアドレス6915に0を入れています。


調べてみると、このアドレスは16進数に直すと&H1B03となり、スプライトアトリビュートテーブル(&H1B00〜&H1B7F)を指している事がわかりました。


スプライトアトリビュートテーブルは、スプライトのY座標、X座標、色、パターン番号の合計4バイトで構成されたブロックがスプライト面分ある事で、

4*32=128バイト(&H1B00〜&H1B7F)

の領域と4バイトずつのブロックで構成されている事がわかりました。

となると、&H1B03は&H1B00(スプライト面0の開始アドレス)から4バイト後なので、スプライト面1のY座標に0を入れている事になります。

しかし、ここで気をつけなければいけないのは、本当のY座標の0は255となっており、0を入れるとそのスプライト面以降のスプライトは表示されません。


次は、CLSで画面を消して、RESRORE文でREAD命令を220行から読み込むようにします。


そして60行にまたがる、2重のFOR〜NEXTですが、一番内側で行われている処理から見ていきたいと思います。


LOCATE 0,J で位置を決めて、PRINT文で後に続くSPC(34)の34キャラクタ文のスペースと、MID$を使って””の中の文字列を29キャラクタ文ずつ表示しています。


始めにスペースが34キャラクタ表示するという事は、10行のWIDTH文で横を32キャラクタと指定している為(SCREEN1のデフォルトは29キャラクタ)、1行目と2行目の2キャラ分がスペースとなり、2行目の3キャラクタ目から、MID$で指定した29キャラクタを表示します。

そして、表示する前にLOCATE0,Jで位置を決めているのですが、この変数Jは内側のFOR〜NEXの添え字の変数となっています(0〜10−I)。

また、その変数Jの内容に関わってくる変数 I は、外側のFOR〜NEXの添え字の変数になっています(0〜4)。

簡単に動きを追ってみると、最初の変数 I は0だから、変数Jは0〜10となり、LOCATEのY座標が0〜10ということになる。

先程紹介した2行分表示するPRINT文が、同じ内容を1行ずつ下にずらしながら表示する事になる。

1行ずつ下へずらしながら2行表示すると、前に書いた2行目である2キャラクタ分のスペース+MID$で指定した29キャラクタが、次の1行目である空白行で消されるしくみになり、さらにその下へ同じ2行目のキャラクタで埋めるという事は、描かれた1行分のキャラクタが1行ずつ下へ下がっていくアニメーションになることがわかります。

下がり終わると、PLAYの2重奏で音を出します。

そして下がり終わる座標は変数Jできまり、始めは10ですが、次は変数 I が1になるので、9 → 8 → 7 → 6 と変化します。

ブロックが1段ずつ積み重なっていくアニメーションのしくみがわかりました。


変数Vに0を、変数T(ステージ番号)に1を入れて、50行のRESTORE命令で220行に設定したので、READ T$は、220行のDATA文から読み込みます。


60行(途中より)



確認の為、もう一度60行を表示してみます。



掲載されていた雑誌の解説によると、60行の最後はトリガー待ち(ジョイパッドのボタンか、スペースキーが押されるか)のようです。

まず、FOR文で添え字は I になっています。

添え字 I は、0〜1となっており、2回繰り返す事になります。

つぎは、

PRINT E$”/+”+MID$(”PUSH SPACE          ”,V*10+1,10)

とあり、E$は20行でCHR$(27)+”Y”が代入されています。

つまりエスケープシーケンスで、E$に続く”/+”でY=15、X=11のキャラクター座標となり、そこに「PUSH SPACE〜」を表示します。

つぎにまたFOR文が出ており、添え字はJ(0〜90)でネストしています。

IF STRIG(0)+STRIG(1)=0という式で、スペースキーかジョイスティック端子1のトリガが押されているかチェックしています。

そして、押されていれば−1、押されていなければ0なので、その後のTHEN以後の命令は、何も押されていなければ実行になります。

THEN以後の命令を見ると、

NEXT、これはJの添え字のFOR文に当たります。

I=0、先程のFOR文の添え字を0にリセットします。

V=−(V=0)は、変数Vが0なら1、1なら0にする式です。

補足にありましたが、そのようなときには「V=1−V」とすると良いそうです。

この場合変数Vは、PRINT文でMID$を使って文字列を表す添え字として使われています。

つまり、変数Vは始めに0、そのあと1と変わることで、PRINT文は「PUSH SPACE」と空白の10行(何も表示しない)を90カウント(0〜90)で切り替えて、文字列が点滅しているように表現しています。

その後のNEXTは添え字 I のFOR文に当たります。

また、先程のIF文が偽の時はELSE文がないので、次の行番号70行へと飛ぶ事になります。

しかし、70行を見ていくと、NEXTよりも先に添え字 I のFOR文が現れます。

70行を表示してみます。



これにはどの様に内部で行われているのか悩みましたが、NEXTの前に同じ添え字のFOR文が来てしまうと、前のFOR文は破壊されて(リセット?)しまうようです。

同じく、ネストされた添え字JのFOR文も破壊されてしまいようです。


次は、70行の解析になります。

 

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