No. | 問題点 | 対策 | 備考 |
1 | 変数がA〜Zまでの26種類しか使えない。 | 演算やパラメータの受け渡しは、原則スタックを使う。 | |
2 | 変数が全て広域変数であり、 局所変数が使えない。 | (同上) | |
3 | サブルーチンからの戻りアドレスは変数「!」に 格納されるが、サブルーチン内 にてジャンプや 更にサブルーチンの呼び出しを実行すると 変数「!」が破壊されるため、戻り行番号が 破壊されメイン・ルーチンに戻れなくなる。 | サブルーチンの冒頭で戻り行番号を格納している 変数!の値を 戻りアドレスを格納するための 専用スタック(=リターン・スタック)に 格納する。 メイン・ルーチンに戻るときは、リターン・スタック から戻り行番号を取り出す。 | |
4 | バイト・アクセスのための機能がない | バイトアクセスのために変数「^」と変数「\」を用意する。 変数「^」はバイトアクセスするためのポインタ。 X=\でポインタが示すバイトアドレスのデータを変数Xに代入。 \=Xでポインタが示すアドレスにバイトデータで変数Xを格納。 配列の要素eとバイトアドレスptrはptr = e * 2の関係がある。 | |
5 | ディスク・アクセスのための機能がない | ||
6 | 1文字の入力変数「$」をパソコン上で実現する 場合、既存の言語の多くは文字入力する際、 Enterキーを押すまで制御が戻らない。 | ||
7 | DATA文がない |
変数名 | 割当機能 | 備考 |
A | 実行中の行の先頭アドレスへのポインタ | |
B | 行バッファの先頭アドレス | |
C | テキスト・バッファの先頭アドレス | |
D | テキスト・バッファの最終アドレス+1へのポインタ | |
E | 変数エリアの先頭アドレス | |
P | パラメータ・スタック・ポインタ | |
R | リターン・スタック・ポインタ | |
X | サブルーチン内で消費 | |
Y | 予約 (サブルーチン内で消費) | |
Z | 予約 (サブルーチン内で消費) |
行番号 | 名称 | パラメータ スタック | 処理 | 備考 |
1000 | PSHR | --- | 変数Xをリターンスタックにプッシュします。 サブルーチンの冒頭で変数!に格納されたメインルーチンの 戻りアドレスをリターンスタックに積むときに使用します。 | |
1100 | RET | --- | サブルーチンからメインルーチンに戻ります。そのために リターンスタックに格納された戻りアドレスを変数「#」に代入します。 | |
1200 | LIT | --- u | 変数Xの値をスタック(TOS)に積みます。 | デバッグ用 |
1300 | DDOT | u --- | 符号なし16bit整数uを10進で画面に表示し、 TOSは捨てます。 | デバッグ用 |
1400 | GETLN | ptr --- n | キーボードから文字列を入力し、配列のバイトアドレスptr 以降の配列に格納します。入力された文字数はnとなります。 | |
1500 | PUTLN | ptr1 c --- ptr2 | 配列のバイトアドレスptr1以降の文字列を区切り 文字cの直前まで画面に出力します。 ptr2は文字列の区切り文字の次のバイトアドレスになります。 | |
1600 | MSG | ptr1 --- ptr2 | 配列のバイトアドレスptr1以降の文字列を区切り 文字0x00の直前まで画面に出力します。 ptr2は文字列の区切り文字の次のバイトアドレスになります。 | |
1700 | SKPBL | ptr1 --- ptr2 | 配列のバイトアドレスptr1以降の文字列の先頭の空白をスキップし 空白以外の最初の文字のアドレスをptr2に求めます。 | |
2000 | ROT | n1 n2 n3 --- n2 n3 n1 | スタック上の三つのデータをn1がトップに 来るように順番を変えます。 | |
2100 | SWAP | n1 n2 --- n2 n1 | スタック上の二つのデータn1とn2の順番を 交換します。 | |
2??? | CMINT | n1 n2 --- c z | 2つの符号付き16bit整数n1とn2を比較します。 n1=n2のときz=1。n1≠n2のときz=0。 n1≧n2のときc=1。n1<n2のときc=0。 | 廃止予定 |
2??? | ABS | n1 --- n2 f | 符号付き整数n1の絶対値をn2に求めます。 またn1の符号がfとなります。n1≧0のときf=0、n1<のときf=1です。 | 廃止予定 |
2??? | DIVID | u1 u2 --- u3 u4 | 符号なし整数u1をu2で割り、その余りu3と商u4を求めます。 | 廃止予定 |
3000 | WINT | n u --- | 符号付整数nを指定された桁数uで画面に出力します。 | |
3400 | WLINE | ptr1 --- ptr2 | 配列のバイトアドレスptr1から始まるテキストの1行を表示します。 ptr2は文字列の区切り文字の次のバイトアドレスになります。 | |
4000 | ERWHT | ptr --- | エラーメッセージ"WHAT?"を表示してエラー処理を行います。 ptrはエラーの場所を示すポインタです。 | |
4100 | ERHOW | ptr --- | エラーメッセージ"HOW?"を表示してエラー処理を行います。 ptrはエラーの場所を示すポインタです。 | |
4200 | ERSRY | ptr --- | エラーメッセージ"SORRY"を表示してエラー処理を行います。 ptrはエラーの場所を示すポインタです。 | |
5000 | GINT | ptr1 --- ptr2 u1 u2 | 配列のバイトアドレスptr1からの文字列を整数u1に 変換します。u2は数字の桁数です。またu1<32768です。 | |
5300 | GETL | c --- ptr | 画面にプロント文字cを表示して、ターミナルから文字列を入力し ライン・バッファに格納します。 入力文字列の最終アドレス+1がptrとして戻ります。 | |
6000 | SRCH | n1 --- n1 ptr1 f | 行番号n1より大きい行番号を持つ行を探します。 f=0:行番号n1と同じ行番号が見つかった。 その行番号の先頭アドレスがptr1。 f=1:行番号n1より大きい行番号が見つかった。 その行番号の先頭アドレスがptr1。 f=65535:行番号n1以上の行番号を持つ行はなかった。 ptr1はテキストの最終アドレス+1。 | |
6400 | TR2 | ptr1 ptr2 ptr3 --- | 配列のバイトアドレスptr1からptr2-1までの内容をptr3-1より 前の領域にコピーします。 コピーの順番はptr2-1からptr1に 向かって行われます。 | |
6600 | TRNSF | ptr1 ptr2 ptr3 --- | 配列のバイトアドレスptr1からptr2-1までの内容を ptr3以降にコピーします。 コピーの順番はptr1からptr2に 向かって行われます。 | |
6800 | SKIPL | ptr1 --- ptr2 | ||
7000 | TSCR2 | ptr --- | ||
9000 | START | --- | ||
10000 | EDITR | --- | ||
11000 | KWCPR | ptr1 --- | ptr1:命令文の文字列の先頭アドレス。 命令文は行バッファまたはテキストバッファのどちらか。 変数「,」に検索するテーブルの行番号が設定されていること。 | |
12000 | BYE | --- | BYEコマンドを実行し、BASICを終了します。 | |
13000 | LIST | ptr1 --- | LISTコマンドを実行します。 ptr1:コマンドの続きのバッファアドレス。 | |
14000 | NEW | ptr1 --- | NEWコマンドを実行します。 ptr1はダミーです。 | |
15000 | RUN | ptr1 --- | RUNコマンドを実行します。 ptr1:コマンドの続きのバッファアドレス。 | |
16000 | EXPR0 | ptr1 --- u1 ptr2 | 括弧による式のくくり出し処理を行います。 ptr1:構文解析中のプログラムへのポインタです。 | |
16400 | FACTR | ptr1 --- u1 ptr2 | ptr1以降の文字列を算術因子として評価し、u1に求めます。 | |
16600 | RND | ptr1 --- u1 ptr2 | 乱数を発生させ、u1に返します。 RND(<式>)の形式で、<式>の値がuのときu1は1〜uです。 | |
16700 | ABS | ptr1 --- u1 ptr2 | 絶対値を求め、u1に返します。 ABS(<式>)の形式です。<式>がオーバーするとエラーになります。 | |
16800 | RSIZE | ptr1 --- u1 ptr1 | テキスト・バッファの残りサイズをu1に返します。 ptr1は不変です。(RSIZEでは未使用) | |
16900 | FNSIZ | ptr1 --- u1 ptr1 | テキスト・バッファの残りサイズをu1に返します。 SIZE関数の処理です。ptr1は不変です。(RSIZEでは未使用) | |
17000 | TSTV | ptr1 --- ptr1 ff ptr1 --- ptr2 ptr3 tf |
ptr1からのテキストが変数かどうか調べます。 ff:ptr1からのテキストは変数ではない。 tf:ptr1からのテキストは変数である。変数の格納アドレスはptr3。 | |
17300 | NUMB | ptr1 --- u1 ptr2 | ptr1以降のテキストを数値u1に変換します。 数値に変換出来ないときはエラーとなります。 | |
17400 | VAR | ptr1 --- u1 ptr2 | ptr1以降が変数かどうか調べ、変数なら内容をu1に
返します。 変数でなければ整定数への変換を試み、その値をu1に返します。 | |
17700 | TERM | ptr1 --- u1 ptr2 | ||
17920 | MULT | ptr1 --- u1 ptr2 | ||
18300 | DIV | ptr1 --- u1 ptr2 |
行番号 | 名称 | パラメータ スタック | 処理 | 備考 |
1000 | PSHR | --- | 変数Xをリターンスタックにプッシュします。 サブルーチンの冒頭で変数!に格納されたメインルーチンの 戻りアドレスをリターンスタックに積むときに使用します。 |
行番号 | 名称 | パラメータ スタック | 処理 | 備考 |
1100 | RET | --- | サブルーチンからメインルーチンに戻ります。そのために リターンスタックに格納された戻りアドレスを変数「#」に代入します。 |
行番号 | 名称 | パラメータ スタック | 処理 | 備考 |
1200 | PUTLN | c addr1 --- addr2 | addr1以降の文字列を区切り文字cの直前まで ディスプレイに出力します。 |
行番号 | 名称 | パラメータ スタック | 処理 | 備考 |
1400 | GETLN | addr1 --- addr2 | キーボードから文字列を入力しaddr1以降の バッファ・メモリに格納します。 |
行番号 | 名称 | パラメータ スタック | 処理 | 備考 |
1600 | SKPBL | addr1 --- addr2 | addr1以降の文字列の先頭の空白をスキップし 空白以外の最初の文字のアドレスをaddr2に求めます。 |