2020.8.22
前へ
次へ
ホームページトップへ戻る

[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜



[第72回]


●REMプログラムの’3E’について

前回REM文のプログラムでIF文のエントリ部に置かれたRST 3をジャンプするために、その直前にDB 3Eを置いています、ということについて説明をしました。
その説明を書いているうちに 同じことを[第58回]で説明したことを思い出しました。
しかしその時点では同じことをREM文でもやっているなんて、全く気が付きませんでした。
[第58回]で説明したプログラムでは1バイトの命令DAD BをジャンプするためにDB 3Eを使っているので、これは全く問題はありません。
しかし今回は同じ1バイトでもRST 3です。
実は中日電工版TINY BASICでは、プログラムを置くアドレスを8000からと考えていることもあってRST命令は使っていません。
RSTの代わりに3バイトのCALL命令を使います。
当然前回説明しましたREMプログラム、IFプログラムもRSTではなくて普通のCALLを使っています。
「だめじゃん」

「だめ」だと思いつつ、念のためにテストをしてみました。
現在の最終版TINYBST7.BINです。
ところが…。



「無事」通ってしまいました。
んなわけはないだろーよ。
ということでその部分のプログラムをよく確認してみましたら。
833A 3E
833B CD
なのでそこは
833A 3ECD MVI A,CD
となります。
オリジナルではこのあと
MOV A,H
が実行されるのですが、TINYBST7ではそうはなりません。
まだ2バイト残っています。
バイナリコードからニーモニックを逆に求めてみましたら、意外なことがわかりました。
833C 77

MOV M,A
です。
この場合HLには0000が入っていますから、MOV M,Aはメモリアドレス0000にAレジスタの値を書き込むという動作になります。
アドレス0000はシステムROMなのでそこになにを書き込んでも変化はありません。
この命令は結果的には無視されます。
次の
833D 80

ADD B
です。
うーん。
これも結果として無視されますねえ。
ということで、私自身は全く気付いていなかったのですが、幸い結果としてはオリジナルのプログラムと同じ働きをすることが確認できました。
やれやれです。

ま。
めでたしめでたし、ということで。

いやいやいや。
そうはいきませんでしょう。
たまたまEXPRのアドレスガ8077だったのでなんとかなったのですけれど、将来のプログラム変更によって、EXPRのアドレスが変わったりしたら、そのアドレスによってはREMプログラムが原因不明の暴走をしてしまうことになるかもしれません。
そもそもRST 3からCALL EXPRに変更した時点で、もうここでDB 3Eを使うのには無理があることになります。
そうとわかったからには、ここはやっぱりプログラムを変更するべきでありましょう。

というところまで書いてきたのですが、本日は時間がなくなってしまいました。
この続きは次回にすることにいたします。

復活!TINY BASIC[第72回]
2020.8.22upload

前へ
次へ
ホームページトップへ戻る