
※途中で戻りたい場合は、ブラウザの「戻る」機能を使ってください。
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.