H23/6/14
 BASICプログラムとマシン語プログラムをリンクして走らせる場合、双方のプログラム間で情報のやり取りに迫られます。通常BASICでは、マシン語とのリンクはUSR関数、あるいはCALL命令を使用して行われます。 これらの関数及び命令は、マシン語をコールする際に引き数としてデータ情報を渡すことができるようになっています。このときの引き数になる値を求めるときに必要不可欠なのがVARPTR(VARiable PoinTeR)関数です。
 御存知の通り、VARPTRは変数の格納アドレスを返す関数です。一般の数値変数を扱うぶんにおいては、直接格納アドレスを返してくれます。しかしそれが文字列変数であった場合には少々込み入った手続きが必要になってきます。N88-BASICの場合、対象が文字列変数のときの返す値は、4バイトのサブ情報域の先頭アドレスです。この情報域はストリング・ディスクリプタと呼ばれ、文字列長(1byte),リロケーション・コード(1byte),格納域先頭アドレス(2byte)という構成になっています。
 さて、ここにN○Cのちょんぼがあることが発覚しました。格納アドレスがわかっても、そのセグメントがわからないのです。マニュアルには「リロケーション・コードが&H00の場合はVARPTR関数で得られた値と同じ。」というふうに書かれているのですが、これが大嘘です。この通りにしても、得られた値はズレたアドレスを指してしまいます。N○Cに問い合わせてみたところ、このときのセグメント・アドレスは1410番地(セグメントは0060H)に格納された値であるとのことでした。なんでこのような大切なことがマニュアルに書いてないのかと問い詰めますと、素直に非をお認めになったのであっけにとられてしまいました。
 文字列配列データなどは、マシン語ルーチンに引き渡すことも多いと思います。以上の点、くれぐれも気を付けてください。絵夢絶党からのお知らせでした。
 
P.S. このことが発覚したのは、私が回線制御の仕事をしていたときのことです。半二重1200BPS のモデムを介してのファイル転送を、PC-9801のN88-BASICでつくっておりました。しかし、しっかりとした通信エラーチェックをオールBASICで処理していたのでは間に合いません(例えばCRC・・・・)。そのようなわけでマシン語を使用してストリング配列域内のデータのエラーチェックをしようとしたのです。

 「あの~、ストリング配列の -(中略)- はどうなっているんでしょうか?」

 「30分ほど時間をください。わかり次第追って連絡いたします。」

 -30分後、N○CからのTEL.-

 「もしもし。先ほどの件ですが、担当の者に確認したところ -中略- ということですので、そのようにしてみてください。」

 「じゃあマニュアルにこう書いてあるのは………。」

 「ああ、すいません。バグです。」

 「…………………。」

・・・・・おかげでまる一日間苦悩の嵐にみまわれました。8086が拍車をかけて嫌いになったことは言うまでもありません。今でも「セグメント」の5文字を耳に、あるいは目にするだけで8086チップの足を全部折りたくなる衝動にかられます。(などと言ってはみましたが、N○Cさんの応対は誠実でよかったです。)