昔のBASICのFOR~NEXT文(その2)

2010/02/25昔のパソコン

昔のBASICのFOR~NEXT文 (基礎文法最速マスターで思い出した)というエントリを書いたら、メカAGさんの目に止まったらしく、「basicのfor-next実装」という記事を書いていただいた。

その中で言及されている記述が、私が忘れているのか、どうも記憶と合わないので識者をさらに召喚する記事を書くことにする。以下、すごく専門的な話になる。

メカAGさんの記事だと、「一方で6809系のbasic、日立のベーシックマスターレベル3や富士通のFM-7シリーズは、forを見つけるとプログラムリスト上で対応するnextを探しに行ったように思う。つまりforとnextが1対1に対応していないとエラーになる。ただコンパイラじゃなくてインタプリタなので、実際にforを実行するまでは対応するnextを探しに行かない。つまりチェックされない」ということだけど、これってそうだったっけ? ということで過去の資料を引っ張り出してみた。FM-8用のF-BASIC 1.0だけど3.0でもそう違いはないはず。

FORとNEXTが1対1対応じゃないときのエラーは “FOR WITHOUT NEXT" で、 while~wendだと"WHILE WITHOUT WEND"。これは $A732($A733) からのルーチンでネスティングをチェックしている。実際に WHILE の実行部($B0F5)では、初期化後いきなり JSR $A732 が実行されている。スタックにはWHILEのアドレスと共にWENDのアドレスが積まれる。

問題の FOR は、 $A733 を呼んでいる気配がない (見落としじゃなければ)。スタックには変数と共にFORの次の文のアドレスが積まれる、ように見える。なので、FORを実行した時点では対応するNEXTは探さないんじゃないかなあ。ということで、誰か覚えてる人教えてください。

あとの記憶はメカAGさんとあまり相違はない。
『0から9までの文字であるか否かをチェックするのだけど、アスキーコードで「9」の後に「:(コロン)」が来ることを利用して、コロンの判定もかねていた』 これは凄い技が使われてて、こんな感じ。 こういう素晴らしいコードを書いたプログラマはいったい誰なんだろう?

          CMPA #$3A
          BCC L01
          CMPA #$20
          BNE L02
          RTS
L02     SUBA #$30
          SUBA #$D0
L01     RTS

昔のパソコン

Posted by ず@沖縄