So-net無料ブログ作成

Undocumented PC-8001 / 8801 【こっそり追記あり】 [パソコン]

今回は、「PC-TechKnow」シリーズ (アスキー出版)や「PC-8001 マシン語活用ハンドブック」「○○解析マニュアル」 (秀和システムトレーディング)にも載っていないような、PC-8001 / 8801 のディープでコアな部分を BASIC 解析マニア(笑)の Thunderbolt が紹介します。




行番号 0

Microsoft 系の BASIC では、行番号として付けられる数字の範囲は1~65529までのはずですが、N-BASIC では行番号 0 の行が入力できてしまいます。N88-BASIC では行番号 0 の行は Syntax error になります。

また、どちらの BASIC でも AUTO コマンドでは、AUTO 0, 10 と入力してもエラーになりません。

しかし、N88-BASIC では、行番号 0 の行は Syntax error になるので、0 A=10 等と入力すると Syntax error が発生して、再度行番号 0 が表示されます。
この状態は、先頭の行番号を変更して 0 以外にするか、STOP キーか Ctrl-C で AUTO モードを中断するまで続きます。

ちなみに AUTO コマンドの書式は以下のとおりです。
書式: AUTO [ 行番号 ][, 増分 ]
「行番号」は0~65529、「増分」は1~65529までの整数値でなければならず、式や数値変数は使用できません。
式や上記範囲外の整数値や実数値はエラー 'SN Error'/'Syntax error' になります。
文字列や文字型変数を指定した場合も 'TM Error'/'Type mismatch' にならず、 'SN Error'/'Syntax error' になります。


「ON ERROR GOTO 行番号」でエラートラップルーチンを指定することが出来ますが、このときの飛び先に、行番号 0 の行を指定することはできません。
これは、ON ERROR GOTO 0 がエラートラップの指定解除に使われる書式なので、仕方がありません。
まぁ、通常はそんなプログラムの組み方をすることはないでしょうが…

ちなみに ON ERROR GOTO コマンドの書式は以下のとおりです。
書式1: ON ERROR GOTO 行番号
書式2: ON ERROR GOTO 0
書式1はエラーが発生した時のトラップルーチンの飛び先を設定する場合、書式2はエラーが発生した時のトラップルーチンの飛び先指定を解除する場合です。



配列変数の添字に付けるカッコ

BASIC の数式や文字列式の計算順序の優先順位を変えたい場合は丸カッコ '(', ')' を使いますが、大抵の方は配列変数の添字にも丸カッコを付けていると思います。
実は N-BASIC と N88-BASIC では、配列変数の添字のカッコは大カッコ '[', ']' が付けられます。
もちろん、ディスクから起動した場合でも可能です。
カッコが複雑に付けられた式も、少しは読み易くなります。

今では、テキストエディタに「対応するカッコの強調表示」なんて機能もありますから、便利になったものですね。

残念なことに、PC-9801 で採用されたN88-BASIC (86) では使えなくなりました。
PC-8801 シリーズ用のリファレンスマニュアルを参考に自社開発されたそうですから、仕方がないですね。
マニュアルには載ってませんから…


PRINT USING

PC-8001 / 8801 リファレンスマニュアルでは PRINT と PRINT USING が別の項目として記述してあり、書式としては PRINT USING <書式制御文字列> ; <式> としか書いてありませんが、実は USING は PRINT の直後にある必要はなく、PRINT "Undefined error occured in "; USING "#####"; ERL という書き方ができます。
ちなみに、ERL はエラーが起きた行を示すシステム変数です。

もちろん PRINT USING "Undefined error occured in #####"; ERL と書いてもいいのですが、書式制御文字列が長いと処理時間が長くなるので、大量に PRINT USING を使う場合の高速化のテクニックとして使われていました。


2009/10/24 追記ここから

CLOAD ? / LOAD ?

カセットテープに BASIC プログラムをセーブした後で、正常に書き込めているかどうかを確かめるコマンドは、
N-BASIC では CLOAD ? "abc"
N88-BASIC では LOAD ? "CAS:abc"
ですが、実は CLOAD PRINT "abc" / LOAD PRINT "abc" と書いても問題なく動作します。

これは、'?' が PRINT コマンドの短縮形として認識されている為なのですが、簡単に確かめる方法があります。
N-BASIC の場合は 10 CLOAD ? "abc"
N88-BASIC の場合は 10 LOAD ? "abc"
とプログラムを打ち込んでリターンキーを押してください。
リストを表示させると 10 CLOAD PRINT "abc" / 10 LOAD PRINT "abc" と表示されます。

2009/10/24 追記ここまで

nice!(1)  コメント(7)  トラックバック(0) 

nice! 1

コメント 7

yasuho

「目からウロコ」の情報です!PC-8001は機械語も含めてけっこう使ったつもりだったのですが、これらの機能は全く知りませんでした。
貴重な情報をありがとうございます。

by yasuho (2009-08-19 22:52) 

Thunderbolt

yasuhoさん、はじめまして。
コメントありがとうございます。

これらの情報は、BASIC ROM の解析で分かったことなので市販の書籍とかには、多分載ってないと思います。

N-BASIC / N88-BASIC ROM のコードは、サイズを小さくするために様々なテクニックが使われていて、トリッキーな部分も多いので、解析は大変です^^;

これからもよろしくお願いします。
by Thunderbolt (2009-08-19 23:40) 

本名荒井

N-BASICの「方言」の話、興味深く拝読しました。
MSX-BASICでも行番号0にはちょっとしたバグがありまた。BASICのリストを表示させると”10 PRINT A”といった具合に、行番号と命令文の間に空白が挟まれますが、0行はその内容に手を入れるたび、この空白が増えていったりします。
by 本名荒井 (2009-08-19 23:51) 

Thunderbolt

本名荒井さん、コメントありがとうございます。

>0行はその内容に手を入れるたび、この空白が増えていったりします。
どの BASIC でも、ちょっとしたバグは残っているんですね。
0 行だけに発生するバグというのも、とても興味深いものがあります。
これを利用すると、0 行に著作権表記をしておいて、改変されたらプログラムサイズから分かるようにできますね(笑)

by Thunderbolt (2009-08-20 13:03) 

Laver

F-BASICの場合、行番号0は普通に使えます。
行番号の上限はV3.0が63999、V3.3/3.4が65529となっています。
配列変数の大カッコ、PRINT USINGは共に使えず、エラーとなりますね。

同じMicrosoft系でも、細部の挙動が微妙に異なるようですね。
by Laver (2009-08-20 21:36) 

Thunderbolt

Laverさん、コメントありがとうございます。

F-BASICは不得意分野なので、Laverさんの情報は大変ありがたいです。

記事の内容がN-BASIC系特有のものなのかどうなのか、N-BASIC以前のMicrosoftの8080系BASICではどうだったのかが気になるところです。

F-BASICはファイル関係のコマンドの一部が同じMicrosoftのGW-BASICと同じ文法だったりしますが、元祖はF-BASICですよね。

by Thunderbolt (2009-08-20 22:37) 

Thunderbolt

単騎さん、nice! ありがとうございます。
by Thunderbolt (2009-08-22 00:51) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。