N-BASIC 概要

PC-8001 に搭載されている N-BASIC について、よく使う機能を中心に解説します(全てではありません)。

細かい説明を省いているところもあるので、 プログラミング初心者には厳しいかもしれませんが、ご了承ください。

あと外部リンクになりますが、N-BASIC リファレンス(PDF)も参考にしてください。




基本事項


プログラム編集

プログラムリストを表示するには LIST コマンドを使います。

LIST         (全リストを表示)
LIST 100     (100 行だけ表示)
LIST 100-200 (100~200 行を表示)
LIST -200    (最初から 200 行までを表示)
LIST 100-    (100 行から最後までを表示)

表示中は ESC キーで一時停止/再開できますが、1 行が長いと反応が鈍くなるので長めに押す必要があります (長すぎると逆に止まらなくなってしまうので注意)。 また、STOP キーで停止できます。

プログラムを行単位で削除するには、行番号のみ入力するか、DELETE コマンドを使います。

DELETE 100     (100 行だけを削除)
DELETE 100-200 (100~200 行を削除)
DELETE -200    (最初から 200 行までを削除)

LIST コマンドとは少し違い、(2 つ目の例の)開始行以外は、指定行が存在しないとエラーになります。

プログラムと変数を全消去するには NEW コマンドを使います。 パラメータはありません。

プログラムを打ち込む際、いちいち行番号を打ち込むのが面倒な場合は AUTO コマンドを使います。 パラメータは、開始行番号、間隔の 2 つです。終了するには STOP キーを押します。

AUTO         (10 行から 10 行間隔)
AUTO 1000    (1000 行から 10 行間隔)
AUTO 1000,20 (1000 行から 20 行間隔)
AUTO ,20     (0 行から 20 行間隔)

プログラムの行番号を綺麗に付け直すには RENUM コマンドを使います。 パラメータは、新開始行番号、旧開始行番号、間隔の 3 つです。

RENUM             (10 行から 10 行間隔)
RENUM 1000        (1000 行から 10 行間隔)
RENUM 1000,100    (100 行以降を 1000 行から 10 行間隔)
RENUM 1000,100,20 (100 行以降を 1000 行から 20 行間隔)

なお、GOTO などで存在しない行が指定されているとエラーが出ますが、 行番号の付け替えはそのまま行われます。 特に作りかけのプログラムでは多少面倒なことになるので、 実行前にプログラムを保存しておくことをおすすめします。

プログラムをカセットテープに保存するには CSAVE コマンドを、読み込むには CLOAD コマンドを使います。 パラメータはファイル名で、最初の 6 文字までが有効です。

また、正しく保存されたかどうかを確認(ベリファイ)するために CLOAD? コマンドがあります。

CSAVE "test"  (ファイル名 test で保存)
CLOAD "test"  (ファイル名 test を読み込み)
CLOAD? "test" (ファイル名 test が正しく保存されたかテスト)



プログラム実行

プログラムを実行するには RUN コマンドを使います。 パラメータは開始行番号で、省略した場合は先頭行から実行します。

プログラムは最終行の実行を終えるか、END 命令を実行すると終了します。

実行中に ESC キーを押すと、プログラムが一時停止します。 何かキーを押すと再開します(SHIFT キーや CTRL キーなどを除く)。

プログラムを中断するには STOP キーを押します。

^C
Break in 10

などと表示されて「ピーッ」と BEEP 音が鳴って中断します(ただし例外があります)。また、プログラム中で STOP 命令を実行した場合も(「^C」が表示されない以外は) 同じ動作をします。

中断後は CONT コマンドで再開できます。ただし、

は再開できません。なお、プログラムを END 命令で終了した場合でも、次の命令から再開します。




コメント

プログラム中にコメントを書きたい場合は REM 命令もしくは 「'」 (アポストロフィ/シングルクォーテーション)を使用します。 その後、行末までがコメントと見なされます。

ちなみに内部の表現方法の都合で、'」の方が 2 バイト多く使用するので注意してください。




変数

変数名は英字 1 文字、もしくは英字+英数字の 2 文字で、3 文字目以降にも英数字が使用できますが無視されます。 かなり厳しい制限なので注意してください。

変数の型は 4 種類あります。


表現可能範囲 付加記号
整数 -32768~32767 %
単精度実数 指数部 8bit、符号+仮数部 24bit(約 7 桁) !
倍精度実数 指数部 8bit、符号+仮数部 56bit(約 16 桁) #
文字列 0~255 文字 $

実数についての細かい説明は省略します。 もう少し知りたい方は「浮動小数点数」で検索してください(ただし IEEE 754 とはビット配置などが違うので注意)。

「付加記号」というのは、変数名や数値の後に付ける記号です。 変数名の付加記号を省略した場合は単精度実数と見なされますが、これは DEFINT などの命令で変更することができます。

DEFINT N   (N で始まる場合は整数変数と見なす)
DEFSNG A,C (A か C で始まる場合は単精度実数変数と見なす)
DEFDBL X-Z (X,Y,Z のいずれかで始まる場合は倍精度実数変数と見なす)
DEFSTR S   (S で始まる場合は文字列変数と見なす)

型が違う同名の変数は、別の変数と見なされます(たとえば A%A$)。

多次元配列を使用することもできます。定義には DIM 命令、消去には ERASE 命令を使用します。次元数には特に制限はありません。

DIM A(9)    (A(0)~A(9) の 1 次元配列を初期化)
DIM M$(2,3) (M$(0,0)~M$(2,3) の 2 次元配列を初期化)
ERASE A     (配列 A を消去)
ERASE A,M$  (配列 A と配列 M$ を消去)

全ての要素は数値なら 0、文字列なら ""(空文字列)で初期化されます。

配列変数は、非配列変数と同名でも別の変数と見なされます (たとえば AA(0))。

なお、添字の表記は小括弧 (~) だけでなく大括弧 [~] でも受け付けますが、PC-8001 の後継機 PC-8001mkIISR に搭載されている N80SR-BASIC では使用できなくなっているので、おすすめしません。




表示関連

表示の基本は PRINT 命令です。 「?」と省略することもできます(プログラム中では自動的に PRINT に変換されます)。

桁数などを揃える場合は PRINT USING 命令が便利です。以下、使用例です。

print 10/3
 3.33333
Ok
?10#/3
 3.333333333333333
Ok
a=1:b=2:c=3:?a;b,c
 1  2          3
Ok
d$="ABC":?using"### +### &   & !";a,b,d$,d$
  1   +2 ABC   A
Ok

画面モードの設定には WIDTHCONSOLE を使用します。

WIDTH のパラメータは、幅と高さです。 幅は 40,80,36,72 のいずれか、高さは 20,25 のいずれかです。幅の 36 と 72 は左右に余白ができるだけなので、滅多に使われません。

CONSOLE のパラメータは、スクロール開始行、スクロール行数、 ファンクションキー表示(0:OFF、1:ON)、カラーモード(0:白黒、1:カラー)の 4 パラメータです。

WIDTH 40,25:CONSOLE 0,25,0,1
WIDTH 80,25:CONSOLE 0,25,0,1

のどちらかを設定することが多いと思います。 なお、カラーモードにすると、幅 40 or 80 モードで画面左端 1 文字が表示できなくなる(幅 39 or 79 になる)ので注意してください。

各パラメータは省略できます。

CONSOLE ,,,1 (カラーモードに変更)
WIDTH ,      (OUT 81,0 の後の再表示)

後者の OUT 81,0 は、画面表示を消して高速化する、というものです。3 割ほど速くなるので、覚えておくといいでしょう。

画面座標の指定には LOCATE を使用します。パラメータは X 座標、Y 座標、カーソル表示(0:OFF、1:ON)の 3 パラメータです。座標は左上が 0,0 です。第 3 パラメータを省略すると 1 と見なされます。

文字色などの指定には COLOR を使用します。 パラメータはファンクション(0~7)、背景キャラクタコード(0~255)、 セミグラフィックモード(0:キャラクタ、1:セミグラフィック)の 3 パラメータです。各パラメータは省略できます。

ファンクションについては、CONSOLE でのカラーモードによって動作が違います。白黒モード時の動作は以下の通りです。

カラーモード時は以下の色になります。

COLOR 0 ■
COLOR 1 ■
COLOR 2 ■
COLOR 3 ■
COLOR 4 ■
COLOR 5 ■
COLOR 6 ■
COLOR 7 ■

背景キャラクタコードは基本的に 0 でいいでしょう。

セミグラフィックというのは、文字の代わりに 2x4 ドットのグラフィックにする機能です。 このセミグラフィックを画面全体で使用する場合は、 セミグラフィックモードを 1 にして画面クリア(PRINT CHR$(12))しておくと良いです。

なお、色指定などに関しては制限があり、行ごとに切り替えが 20 回までとなっています。 この制限は色だけでなく、 文字とセミグラフィックの切り替えについても当てはまります。 画面の構成には気を付けましょう。

その他の複雑な表示関連命令については、「描画」で解説します




演算子

代入演算子は「=」です。頭に LET 命令を付けることもできますが、 容量的にも速度的にも無駄なので、使う必要は無いでしょう。

A=1     (変数 A を 1 に)
LET A=1 (同上)

算術演算子は符号反転、四則演算、べき乗、剰余があります。 「整数」と書かれていないものは実数で計算されます (ただし、べき乗は単精度実数でしか計算できません)。

X=-A      (符号反転)
X=A+B     (加算/文字列の結合)
X=A-B     (減算)
X=A*B     (乗算)
X=A/B     (除算)
X=A^B     (べき乗)
X=A\B     (整数除算)
X=A MOD B (整数剰余)

論理演算子は次の通りです。整数で計算されます。 他にもあるのですが、まず使われないので省略します。

X=NOT A   (否定)
X=A AND B (論理積)
X=A OR B  (論理和)
X=A XOR B (排他的論理和)

比較演算子は次の通りです。真なら -1、偽なら 0 を返します。主に IF 文の中で使用しますが、数値演算にも使用できます。

文字列の場合は先頭から文字コードで比較されます。

A=B  (A=B なら真)
A<B  (A<B なら真)
A>B  (A>B なら真)
A<=B (A≦B なら真)
A=<B (A≦B なら真)
A>=B (A≧B なら真)
A=>B (A≧B なら真)
A<>B (A≠B なら真)
A><B (A≠B なら真)



分岐

任意の行に飛ぶには GOTO 命令を使います。パラメータは行番号です。ラベル名などは使えません

条件分岐は IF~THEN~ELSE~IF~GOTO~ELSE~ を使います。ELSE 以降は無くても構いません。 また、THENELSE の直後に数値を書いた場合は、飛び先の行番号と見なされます(GOTO の省略)。

IF A=1 THEN B=2          (A が 1 なら B を 2 に)
IF A=1 GOTO 100 ELSE 200 (A が 1 なら 100 行へ、そうでないなら 200 行へ)

サブルーチンを呼び出すには GOSUB 命令を使います。 パラメータは行番号です。

サブルーチンから戻るには RETURN 命令を使います。 パラメータはありません。

式の値によって GOTOGOSUB の飛び先を変えるには、 ON~GOTO~ON~GOSUB~ を使います。

ON A GOTO 100,200 (A が 1 なら 100 行へ、A が 2 なら 200 行へ、それ以外は次の命令へ)

式の値が負の場合はエラーになります。 また、各行番号を(「,」だけ記述して)省略した場合は 0 行と見なされます。




ループ

処理を繰り返すには FOR~TO~STEP~NEXT を使います。 FOR の次はループ変数への初期値代入、TO の次は終了値、STEP の次は刻み値です。STEP 以降を省略すると 1 と見なされます。

NEXT を実行するとループ変数に刻み値を加算し、終了値を超えていなければ FOR の直後に戻ります。 パラメータにはループ変数名を列挙しますが、 省略した場合は直近で終わっていない FOR に対応するものと見なされます。

次の例はコマンドラインでの実行例です。

for i=1 to 10 step 2:?i;:next
 1  3  5  7  9 
Ok

次の例は 2 重ループです。どちらでも動きますが、NEXT でループ変数名を指定すると少し遅くなります

FOR I=1 TO 10:FOR J=1 TO 10:NEXT:NEXT
FOR I=1 TO 10:FOR J=1 TO 10:NEXT J,I

ループを途中で終わらせたい場合は、 ループ変数に終了値を代入して NEXT を実行するのがいいでしょう。

10 FOR I=1 TO 3:FOR J=1 TO 3:PRINT I;J
20 IF J=1 THEN J=3
30 NEXT:NEXT
run
 1  1 
 2  1 
 3  1 
Ok



キー入力

数値や文字列への入力を待つ場合は INPUT 命令を使います。

INPUT A            (「? 」と出て数値入力待ち)
INPUT A,B,C        (「? 」と出て数値 3 つ入力待ち)
INPUT "String";A$  (「String? 」と出て文字列入力待ち)
LINE INPUT A$      (1 行入力待ち)
LINE INPUT "? ";A$ (「? 」と出て 1 行入力待ち)

LINE INPUT では 1 行がそのまま取り込まれます。 以下、INPUT での入力時の注意点を挙げます。

INPUT/LINE INPUT では RETURN キーを押すまで進みませんが、INPUT$(N) 関数は N 文字入力されると進みます。 ただし入力待ちの間に STOP キーが押されるとプログラムが終了し、CONT で再開はできません

入力が無い場合でもプログラムを先に進める方法の一つとして INKEY$ 命令があります。

A$=INPUT$(1) (A$ へ 1 文字入力する)
A$=INKEY$    (A$ へ 1 文字入力、入力が無ければ "")

押されたキーによっては、制御コードが入力されることがあります。 これは付録にまとめておきました。

INKEY$ では最後に押されたキー 1 つしかわかりません。 特にゲームで離した状態や複数のキーの状態も知りたい場合、I/O ポートを使用します。I は入力(Input)、O は出力(Output)のことです。

キー入力はこのうち入力ポート 0~9 番が割り当てられていて、INP(P) 関数で読み込むことができます。P はポート番号で、8 ビット(0~255)の値が返ります。 キーが押されていると対応ビットが 0、離されていると 1 になります。 したがって何も押されていないと 255 が返ります。


キー入力ポート一覧

なお、RETURN キーとテンキー RET は共通になっています。

判定は IF 文で AND を使用する方法もありますが、 高速化のために計算式で済ませる方法もよく使われます。

たとえばテンキー 4 で X を 1 減らし、テンキー 6 で X を 1 増やす処理をそれぞれの方法で記述すると、 以下のようになります。

A=INP(0):IF (A AND 16)=0 THEN X=X-1 ELSE IF (A AND 64)=0 THEN X=X+1
A=INP(0):X=X+(A=239)-(A=191) (条件成立時に -1 が返るのを利用)

複数のキーを判定する場合に、一つ注意点があります。 2 つのキーが押されていることまでは正しく判定できるのですが、3 つ以上のキーが押されると押されていないキーも押されていると判定される場合があります。

たとえばテンキー 0,1,8 が押されていると、テンキー 9 も押されていると判定されます。あるポートの 2 つのキーが押され、別のポートでどちらかと同じビットのキーが押されると起こります (上の図で四角になるような関係)。

この問題は回路の構造上の制約なので回避はできません。3 つ以上のキーが押される可能性がある場合は、キー割り当てに注意してください。




算術関数

演算に使う関数をいくつか挙げます。

Y=ABS(X) (X の絶対値)
Y=SGN(X) (X=0 なら Y=0、X>0 なら Y=1、X<0 なら Y=-1)
Y=INT(X) (X を超えない最大の整数)
Y=FIX(X) (小数点以下を切り捨て)

INT はマイナス無限大方向への丸め、FIX はゼロ方向への丸めです。

上記の関数は倍精度実数にも対応していますが、 下記の関数は単精度実数で計算されます

Y=SQR(X) (X の平方根)
Y=SIN(X) (X の正弦)
Y=COS(X) (X の余弦)
Y=TAN(X) (X の正接)
Y=ATN(X) (X の逆正接)
Y=EXP(X) (自然対数の底 e の X 乗)
Y=LOG(X) (X の自然対数)

算術関数ではありませんが、乱数を発生する関数 RND(X) もここで紹介します。X の符号によって動作が変わります。

Y=RND(1)    (引数に関わらず 0 以上 1 未満の単精度実数乱数)
Y=RND(0)    (前回と同じ値)
Y=RND(-1.1) (引数を乱数の種として乱数を初期化)

起動直後は毎回同じ乱数を発生します。 それを避けたい場合、時刻を乱数の種にできるといいのですが、PC-8001 の時計は電源を切るとリセットされてしまうので、その用途には向いていません。

たとえばループでキー入力を待ち、 キー入力されたらループ回数を乱数の種にする、などの工夫が必要となります。




文字列関数

文字コードと文字列の相互変換には、次の関数を使用します。

Y$=CHR$(X) (文字コード X から文字列に変換)
Y=ASC(X$)  (X$ の 1 文字目の文字コードを返す)

次の表は文字コード一覧です。縦軸が 16 進数下位、横軸が 16 進数上位です。


文字コード一覧

数値と文字列の相互変換には、次の関数を使用します。

Y$=STR$(X) (数値 X を文字列に変換)
Y$=HEX$(X) (数値 X を 16 進数文字列に変換)
Y=VAL(X$)  (X$ を数値に変換)

なお STR$ の動作は PRINT とは違い、後ろに空白は追加されません。

部分文字列を扱う関数は以下のものがあります。

Y$=LEFT$(X$,N)  (X$ の最初の N 文字を返す)
Y$=RIGHT$(X$,N) (X$ の最後の N 文字を返す)
Y$=MID$(X$,N,M) (X$ の N 文字目から M 文字を返す)
Y$=MID$(X$,N)   (X$ の N 文字目以降を返す)
MID$(X$,N,M)=Y$ (X$ の N 文字目から M 文字を Y$ に置き換える)

MID$N は、最初が 1 です(他の言語では 0 のものがあるので注意)。

MID$ を左辺にした例で、Y$M 文字に満たない分は置き換えられません。M 文字を超えた分は無視されます。

他に文字列を扱う関数には以下のものがあります。

Y=LEN(X$)        (X$ の文字数を返す)
Y=INSTR(X$,A$)   (X$ の中で A$ が含まれている最初の位置を返す)
Y=INSTR(N,X$,A$) (X$ の N 文字目以降の中で A$ が含まれている最初の位置を返す)
Y$=STRING$(N,X$) (X$ の最初の文字を N 個並べた文字列を返す)
Y$=STRING$(N,M)  (文字コード M の文字を N 個並べた文字列を返す)
Y$=SPACE$(N)     (空白を N 個並べた文字列を返す)

INSTR が返す値も MID$ と同様で、最初が 1 です。A$X$ に含まれていない場合は 0 が返ります。




ユーザー定義関数

よく使う計算式を、サブルーチンとは別の方法で呼び出す方法があります。 DEF FN 命令で定義し、FN 関数で呼び出します。

10 DEF FNA(X,Y)=X*Y (式を定義)
20 PRINT FNA(3,5)   (呼び出し)
run
 15 
Ok

FN の後には、変数名と同様に英字 1 文字、もしくは英字+英数字の名前を付けます。 型に関する付加記号についても変数名と同様です。

続いて (~) で引数リストを記述しますが、これは省略可能です。

なお、DEF FN はコマンドラインで即時実行するとエラーになります。




データ記述

プログラム内にデータを列挙するには DATA 文を使用し、それを読み込むには READ 命令を使用します。

10 READ A,B$:PRINT A;B$
20 DATA 123,ABC
run
 123 ABC
Ok

カンマを含む文字列を記述するには「"」 (ダブルクォーテーション)で囲みます。

読み始める DATA 行を指定するには RESTORE 命令を使用します。

10 RESTORE 30:READ A:PRINT A
20 DATA 123
30 DATA 456
run
 456 
Ok

なお、実行開始から一度も RESTORE 命令を実行せずに READ 命令を実行すると、プログラムの最初から DATA 文を探すので時間がかかりますRESTORE 命令を実行しておくと時間を短縮できます。




描画

PRINT 以外での描画には、文字単位のものとセミグラフィックがあります。 セミグラフィックとは、文字の代わりに 2x4 ドットのグラフィックにする機能です。

まずはセミグラフィックで点を打つ/調べる命令を解説します。 [~] は省略可能を意味します。

PSET(X,Y[,C])   (座標 X,Y に色 C で点を打つ)
PRESET(X,Y[,C]) (座標 X,Y の点を消す)
A=POINT(X,Y)    (座標 X,Y に点があれば -1、無ければ 0 が返る)

C を省略した場合、COLOR の第 1 パラメータで設定した色が使われます。PRESET では PSET と同様に、周辺の 2x4 ドットの色が変わります。

POINT でセミグラフィックでなく文字の場所を調べた場合は 0 が返ります。

次に線を引く命令を解説します。 これは文字とセミグラフィックの両方があります。色 C の省略については、上記のものと同じです。全て座標 X1,Y1 から X2,Y2 に対して行います (文字の場合は文字単位、セミグラフィックの場合はドット単位で指定)。

LINE(X1,Y1)-(X2,Y2),A$[,C]      (A$ の 1 文字目で線を引く)
LINE(X1,Y1)-(X2,Y2),A$[,C],B    (A$ の 1 文字目で四角を描く)
LINE(X1,Y1)-(X2,Y2),A$[,C],BF   (A$ の 1 文字目で四角を塗りつぶす)
LINE(X1,Y1)-(X2,Y2),PSET[,C]    (セミグラフィックで線を引く)
LINE(X1,Y1)-(X2,Y2),PRESET[,C]  (セミグラフィックの線を消す)
LINE(X1,Y1)-(X2,Y2),PSET[,C],B  (セミグラフィックで四角を描く)
LINE(X1,Y1)-(X2,Y2),PSET[,C],BF (セミグラフィックで四角を塗りつぶす)

ようは文字列を指定すれば文字、PSET/PRESET を指定すればセミグラフィックでの描画になります。B は Box、BF は Box Fill を意味します。

なお、LINE 命令には表示を行単位で制御する記述もあり、 カラーモード(CONSOLE の第 4 パラメータが 1)の時のみ使用できます。

LINE Y,F (Y 行のファンクションを F に設定する)

ファンクション F については以下の通りです。白黒モードの COLOR 設定とは違うので注意してください。

矩形範囲をまとめて取得/描画する GET@ 命令と PUT@ 命令があります。 全て座標 X1,Y1 から X2,Y2 の矩形に対して行います。

GET@(X1,Y1)-(X2,Y2),A     (配列 A に範囲内の文字を取り込む)
GET@(X1,Y1)-(X2,Y2),A,G   (配列 A に範囲内のセミグラフィックを取り込む)
PUT@(X1,Y1)-(X2,Y2),A[,C] (配列 A を色 C で描画する)
PUT@(X1,Y1)-(X2,Y2),A,F   (配列 A をファンクション F でセミグラフィック描画する)

C を省略した場合(もしくは指定できない場合)は COLOR で設定した色になります。

ファンクション F は以下のいずれかです。

さらに色やセミグラフィックの状態も扱う GET@A/PUT@A 命令があります。座標は文字単位です。

GET@A(X1,Y1)-(X2,Y2),A (配列 A に取り込む)
PUT@A(X1,Y1)-(X2,Y2),A (配列 A の内容を描画)

GET@/GET@A に必要な配列サイズについてですが、 まず必要なバイト数について説明します。

GET@ では、文字の場合「必要なバイト数=総文字数」となります。

セミグラフィックの場合は 8 ドットで 1 バイト使用し、さらにもう 2 バイト必要になります。

GET@A では「必要なバイト数=総文字数の 2 倍」になります(セミグラフィックは 2x4 ドットで 1 文字分の扱いです)。

そして配列変数の型によって、必要な配列サイズが変わります。

必要なバイト数を上記の数で割って切り上げれば 必要な配列サイズが求まります。計算に自信が無い場合は、 配列サイズを増減しながら試してみるといいでしょう。

また、配列への取得後に PRINT で一通り表示し、DATA 文としてプログラム化すれば、GET@/GET@A を使用せずに PUT@/PUT@A を使用することができます。 ただしその場合は整数型を使用してください (数値の誤差が出るのを防ぐため)。




PC-8001 本体のサウンド機能は、BEEP 音と呼ばれる 2.4kHz のブザーのみです。

BEEP 1 (ON)
BEEP 0 (OFF)
BEEP   (一定時間 ON/OFF を反転)

特にゲームでは ON/OFF のタイミングを調整することで、効果音として使われます。




メモリ関連

使用できるメモリが何バイト残っているかは、FRE 関数で確認できます。 パラメータが数値ならプログラム+変数用の残り、 パラメータが文字列なら文字列領域の残りを返します。

?fre(0)
 26786 
Ok
?fre("")
 300 
Ok

定義された変数を全て消去するには CLEAR 命令を使用しますが、この命令には他の役割もあります。

CLEAR            (変数を全て消去)
CLEAR 300        (さらに文字列領域を 300 バイト確保)
CLEAR 300,&HCFFF (さらに BASIC 領域を &HCFFF までとする)

最後の書式については、マシン語の知識を必要とするため、 ここでは解説しません。

変数を定義するとメモリ(BASIC 領域)をいくらか消費しますが、 文字列変数はさらに文字列を格納するためのメモリを必要とする場合があり、 それが上記の文字列領域です。プログラム中に直接書かれている場合は (その文字列が利用されるため)文字列領域は使用されません。

以下、文字列領域が何バイト使用されるかの例です。

10 A$="ABC"    (使用されない)
20 B$=A$+"DEF" (6 バイト使用される)
C$="ABC"       (3 バイト使用される)
Ok

最後の例は(即時実行でプログラムが残らないため)使用されます。 扱いが違うので注意してください。




マシン語関連

軽くマシン語関連の命令を挙げておきますが、 よく理解せずに使用すると危険なので、 ここでは詳しい説明は省略します。

POKE &HF300,&H41 (アドレス &HF300 に &H41 を書き込む)
A=PEEK(&HF300)   (アドレス &HF300 の値を読み込む)
DEF USR0=&HE000  (マシン語ルーチン 0 番のアドレスを &HE000 に設定)
Y=USR0(X)        (マシン語ルーチン 0 番を呼び出す)
Y=VARPTR(X)      (変数 X の格納アドレスを返す)

MON コマンドを実行すると「マシン語モニタ」に制御が移り、 コマンドプロンプト「*」が表示されます。 CTRL キーを押しながら B キーを押すと BASIC に戻ります

以下、コマンドを軽く解説します。アドレス指定は 16 進数、[~] は省略可能です。

D[開始アドレス][,終了アドレス]  (メモリ内容表示)
W開始アドレス,終了アドレス      (カセットテープへの保存)
L               (カセットテープからの読み込み)
LV              (カセットテープからの読み込みテスト)
S[開始アドレス] (メモリ編集開始)
G[開始アドレス] (マシン語プログラムを実行)
TM              (メモリの動作テスト)




付録
文字コード一覧

縦軸が 16 進数下位、横軸が 16 進数上位です。

これまでの解説の中での「空白」は、&H20(32)の文字を指します。


文字コード一覧

文字コード &H00~&H1F(0~31)は「制御コード」と呼ばれ、いくつかは PRINT すると特殊な動作をします。

また、INPUT$INKEY$ でのキー入力時に、制御コードが入力されるものがあります。

キー入力ポート一覧

RETURN キーとテンキー RET は共通になっています。


キー入力ポート一覧
未解説命令一覧

パラメータなどの解説を省略しています。

&O            (8 進数表記)
&             (8 進数表記)
X=A EQV B     (等価、NOT(A XOR B) と同じ)
X=A IMP B     (包含、(NOT A) OR B と同じ)
SWAP X,Y      (変数 X と Y の値を入れ替え)
Y=CINT(X)     (X を整数へ変換)
Y=CSNG(X)     (X を単精度実数へ変換)
Y=CDBL(X)     (X を倍精度実数へ変換)
Y$=OCT$(X)    (数値 X を 8 進数文字列に変換)
POS(0)        (カーソル X 座標、パラメータはダミー)
CSRLIN        (カーソル Y 座標)
SPC(N)        (PRINT 文中で空白を N 個表示)
TAB(N)        (PRINT 文中で左端から N 文字以降の位置へ移動)
PRINT#-1      (カセットテープへ値を出力)
INPUT#-1      (カセットテープから変数へ読み込み)
MOTOR         (カセットテープレコーダーのモーター制御)
DATE$         (日付)
TIME$         (時刻)
KEYLIST       (ファンクションキーのリストを表示)
KEY N,A$      (ファンクションキー N 番を A$ に設定)
OUT P,D       (出力ポート P へ D を出力)
WAIT          (入力ポートが条件を満たすまで待つ)
ERROR         (エラーを発生させる)
ERL           (エラー行番号)
ERR           (エラーコード)
ON ERROR GOTO (エラー処理ルーチンの行番号を設定)
RESUME        (エラー処理から戻る)
TRON          (トレースモード ON)
TROFF         (トレースモード OFF)
INIT%         (RS-232Cの設定)
PRINT%        (RS-232Cへ値を出力)
INPUT%        (RS-232Cから変数へ読み込み)
N=PORT(C)     (RS-232Cの残り受信バイト数)
TERM          (ターミナルモード)

inserted by FC2 system