この文章は超ミニBASIC for SH7047の、文法について説明したものです。
以下の文章で、下にあるような枠で囲まれた文章は、超ミニBASICの内部構造を詳しく知りたい人向けに書いた文章です。内部構造に興味がない人は読み飛ばしても構いません。
|
|
超ミニBASIC for SH7047はシリアルターミナル、またはパソコンのシリアルターミナルソフトから以下のようにして操作します。
プログラムを入力するには行番号に続けて文を入力してください。入力された行の先頭に数字があればそれはプログラムの入力と見なされ、メモリに貯えられます。
プログラムは入力した順ではなく、行番号の小さい順に並べ替えられてメモリに貯えられます。プログラムを実行する際にも、基本的には行番号の小さい行から順に実行されます。
LISTコマンドでプログラムリストを表示すると、行番号部分は右詰めで表示されます! |
メモリ上には、行番号以外はすべてテキストのまま格納しています。
|
コマンドを実行したい場合、または文を即時実行したい場合(これを文のダイレクトモード実行と言います)、行番号を付けずにコマンドまたは文を入力します。コマンドと文の違いは以下の点です。
使用可能なコマンドの一覧はこちら、文の一覧はこちらを参照してください。
超ミニBASICのプログラムは複数(1行でもかまわない)の行からなります。行は行番号と本文からなります。本文は複数(1つでも構わない)の文からなります。行の長さは240文字までで、240文字を越えたぶんは切り捨てられます。また、行末の空白も切り捨てられます。タブ(文字コード$09)は1個の空白に変換されます。
本文に複数の文を書くには、文を :(コロン)で区切って並べて書きます。これをマルチステートメントといいます。
行番号には、1〜4294967294までの数値を書きます。行の先頭の空白を除いた最初の数字の塊が行番号とみなされます。行番号より後ろの、行末までが本文とみなされます。
本文は、基本的には英大文字に変換されてメモリに貯えられます。ただし、"(ダブルクオート)で囲まれた文字列と、'(シングルクオート)から行末までの文字列は変換されません。
「行」の例:
100 FOR I=0 to 9 : PRINT I,"ABC" : NEXT 行番号 文 文 文 ← 本文 → |
数値は32ビット整数値です。扱える範囲は符号付きなら -2147483648〜2147483647 、符号無しなら 0〜4294967295 です。
数値の頭に $(ドル)を付けることによって16進数も扱うことができます。その場合、$ と数字の間にはスペースを入れないでください。
符号付き・符号無しは、数値に適用する演算子が符号付きか符号無しかによって決まります。数値自身は自分が符号付きなのかどうかを自覚していません。
オーバーフローは検出しません。オーバーフローした場合下位32ビットのみが有効になります。たとえば、 $80000000+$80000000 は 0 です。
SHの内蔵I/Oのアドレスを表す定数です。 定数の一覧はこちらを見てください。
例:&PAIORL (ポートA I/OレジスタL、値は $FFFF8386 )
変数は、単純変数のみです。配列変数や文字列変数はありません。変数名は英字1文字で、全部で26個あります。ちょっと少ないようですが、サブルーチンではローカル変数を使うことができるので、大昔のtinyBASICよりはかなり制約は少なくなっています。
以下のものがあります。レベルの高いものほど優先度は高くなります。
レベル1(比較系) |
= <> > < >= <= _> _< _>= _<= |
レベル2(加減算系) |
+ - OR XOR |
レベル3(乗除算系) |
* / _/ AND |
旧来のBASICとはかなり優先順位が異なりますので注意してください。特に注意すべきなのは AND OR 等が比較系の演算子より優先度が高いことです。たとえば「A=0で、なおかつB=0」なんて場合、旧来のBASIC感覚で
などと書くと期待した動作をしてくれません。面倒かもしれませんが
と書いてください。 |
<関数名>(<式>)の形をしているものを関数といいます。使用できる関数の一覧はこちらを見てください。
書式:
<開始行番号>から<終了行番号>までの行を削除します。
書式:
プログラムのリストを画面に表示します。
"<文字列>"を指定すると、その文字列を含む行のみ表示します。文字列の長さは半角で30文字までです。行番号部分は文字列検索の対象にはなりません。
行範囲を指定すると、指定範囲のみ表示します。もちろん、文字列と行範囲を両方指定することも可能で、その場合指定範囲内で文字列を含む行のみを表示します。
<行範囲>の指定の仕方には、以下の4つの書き方があります。
<行番号> |
行番号が一致する1行のみ |
<開始行番号>- |
開始行番号からプログラムの最後まで |
-<終了行番号> |
プログラムの先頭から終了行番号まで |
<開始行番号>-<終了行番号> |
開始行番号から終了行番号まで |
書式:
現在のメモリ上のプログラムを消去します。
<開始番地>と<バイト数>を指定すると、以後その範囲をBASICのテキストエリアとして使用するよう、BASICインタプリタを設定しなおします。CPUに外付けしたRAM上にBASICテキストを置きたいときに指定します。<開始番地>に4で割り切れない番地を指定するとエラーになります。
このコマンドは、その範囲に接続されたメモリをイネーブルにする操作などは行いません。メモリが実際にどのように接続されているか(8ビットバスか16ビットバスか、CS端子を使用しているか否か、等)はシステムによって様々だと思われるからです。このコマンドを使用する前に、POKE文でバスステートコントローラやピンファンクションコントローラのレジスタを適切に設定してください。また、このコマンドは指定の範囲に本当にRAMが実装されているかどうかのチェックはしませんので注意してください。
書式:
行番号を付けなおします。
<旧行番号>で始まる行番号に、<新行番号>を付け、それ以降の行は<増分>づつ行番号を増やして行きます。
<新行番号>および<増分>は省略すると10とみなされます。
書式:
現在メモリ上にあるプログラムを実行します。ラベルの指定がない場合はプログラムの先頭から、指定がある場合はそのラベルから実行を開始します。
実行中のプログラムを中断したい場合はCTRL−C(文字コード $03)をシリアルターミナルから送ってください。
分岐構文とは、条件に応じてプログラムの流れを変えたり、サブルーチンを呼び出したりサブルーチンから戻ったりする文です。
書式:
ラベルに指定された行に飛びます。
書式:
ラベルに指定されたサブルーチンに飛びます。飛んだ先でRETURN文が実行されると、この文の次から実行されます。
GOTO文、GOSUB文ともにラベル「しか」使えません。飛び先を行番号で指定することはできません。 |
書式:
サブルーチンを呼び出した、GOSUB文の次の文に戻ります。
書式:
サブルーチンの中でローカル変数を使えるようにします。この文自体はプログラムの流れを変えたりするわけではないのですが、GOSUB文、RETURN文と深い関係があります。
<変数並び>には、ローカル変数にしたい変数名をコンマで区切って書きます。
GOSUB文で呼ばれたサブルーチンの中でこの文を実行すると、指定された変数の値は保存され、RETURN文を実行したときに復帰されます。これによりサブルーチン中でうっかりメインルーチンで使っているのと同じ変数を別の目的に使ってしまい、変数の値が意図しない値に化けてしまうというバグを防ぐことができます。
LOCAL文のベタな例:
10 A=5 20 PRINT "MAIN:A=",A 30 GOSUB *SUB 40 PRINT "MAIN:A=",A 50 END 100 *SUB:LOCAL A 110 PRINT "SUB:A=",A 120 A=1000 130 PRINT "SUB:A=",A 140 RETURN |
10 FOR I=0 TO 9 20 GOSUB *SUB 30 PRINT 40 NEXT 50 END 100 *SUB 110 LOCAL I 120 FOR I=0 TO 9 ' この I はメインルーチンの I とは別物 130 PRINT I, 140 NEXT 150 RETURN |
書式1:(一行IF文)
※ IF と ( の間にスペースは入れられません
<式>の値が0でなければ行末までの<文>が実行されます。当然マルチステートメントも可です。<式>の値が0ならば、<文>は無視され、次の行に行きます。
書式2:(構造化IF構文)
※ IF と ( の間にスペースは入れられません
<式>の値が0でない場合、 }{ (ELSEと読みます)または } (ENDIFと読みます)がプログラム中に現れるまでの区間を実行します。現れたのが } ならIF構文は終了し、そのままプログラムの実行を続けます。 }{ が現れた場合、以後 } が現れるまでの区間はスキップされます。
<式>の値が0の場合、 }{ または } がプログラム中に現れるまでの区間はスキップされます。}{ または } が現れたら以後のプログラムの実行を続けます。
※ }{ (ELSE)の } と { の間にスペースは入れられません
構造化IF構文の例:
10 FOR A=1 TO 10 20 IF(A<5) { 30 PRINT A," A<5" 40 }{ 50 PRINT A," A>=5" 60 } 70 NEXT |
書式:(ELSE文)
書式:(ENDIF文)
構造化IF構文の、実行範囲を示します。詳しくはIF文の項を参照してください。
書式:
プログラムの実行を終了し、BASICのコマンド受け付け状態に戻ります。
ループ構文とは、くり返しを行うための構文です。
・ループ構文全般に関する注意
ループの中からGOTOで飛び出さないでください。一見問題ないように見えますが、プログラム終了時に UNEXPECTED END になります。また、ネストされたループ内で何度もやっているうちに OUT OF WORKSPACE になります。ループを途中で出たい場合はBREAK文を使ってください。
また、ループの外部からGOTOで中に飛び込まないでください。 STRUCTURE NEXT ERROR になります。
ループ構文は、ダイレクト実行した場合くり返しは行いません。
書式:
対応するNEXT文までの区間をくり返し実行します。
STEP <式3> を省略した場合、式3の値は1であるとみなされます。
まず<変数>に<式1>の値が代入されます。また、<式2>(STEP節がある場合は<式3>も)の値もこの時点で評価されます。
プログラムがNEXT文まで実行された時、<変数>に<式3>の値が加算されます。そして<変数>の値が<式2>より小さいとき(<式3>が負の場合は<変数>の値が<式2>より大きい時)、FOR文の直後に戻ります。その比較は、必ず符号付き数値とみなされるので注意してください。
くどいようですが、<式2>および<式3>の評価は最初にFOR文を実行した時にのみ行われます。くり返し処理の中で<式2>および<式3>の値を変更しても、くり返しの回数は変化しないことに注意してください。ただし、<変数>の値を書き換えた場合はくり返しの回数は変わります。
FOR〜NEXT構文の例:
10 FOR I=0 TO 9 20 FOR J=0 TO 9 30 PRINT I*10+J, 40 NEXT 50 PRINT 60 NEXT |
書式:
FOR〜NEXT構文の、くり返し区間の終わりを表します。詳しくはFOR文の項を見てください。
NEXTの後に変数名を書くことはできません。 |
書式:
対応するWEND文までの区間を、<式>の値が0以外の間くり返し実行します。<式>の値はくり返しのたびに毎回評価されます。
<式>の値が0の場合、対応するWEND文の次までスキップされ、それ以上くり返しは行いません。<式>の値が最初から0の場合、その区間は一度も実行されません。
WHILE〜WEND構文の例:
10 I=0 20 WHILE I<10 30 PRINT I 40 I=I+1 50 WEND |
書式:
WHILE〜WEND構文の、くり返し区間の終わりを表します。詳しくはWHILE文の項を見てください。
書式:
REPEAT〜UNTIL構文のくり返し区間の最初を表します。詳しくはUNTIL文の項を見てください。
書式:
<式>の値が0なら対応するREPEAT文の直後に戻ります。<式>の値が0以外なら何もせず次の文に進みます。
REPEAT〜UNTIL構文の例:
10 I=0 20 REPEAT 30 PRINT I 40 I=I+1 50 UNTIL I=10 |
書式:
FOR〜NEXT構文、WHILE〜WEND構文、REPEAT〜UNTIL構文などのくり返しから脱出します。
BREAK文の例:
10 FOR I=0 TO 9 20 PRINT I 30 IF(I=5) BREAK 40 ' IF(I=5) {BREAK} ' こう書いてもよい 50 NEXT |
書式:
FOR〜NEXT構文、WHILE〜WEND構文、REPEAT〜UNTIL構文などのくり返しの先頭に戻ります。
CONTINUE文の例:
10 N=0 20 FOR I=0 TO 9 30 PRINT I 40 INPUT "-1:CONTINUE ",N 50 IF(N=-1) CONTINUE 60 NEXT |
入出力文とは、CPUのメモリや内蔵I/Oを操作する文や、シリアルターミナルに文字列や数値を表示したり、シリアルターミナルから数値を入力したりする文です。
・BCLR文、BSET文、POKE文に関する注意
これらの文で、不用意にBASICインタプリタの作業領域や、CPUのI/O領域を操作するとCPUが暴走する恐れがあります。十分注意して使用してください。(FRE関数の項も参考にしてください)
内蔵I/Oレジスタのうち、書き込み専用レジスタに対しBSET文、BCLR文を実行すると意図しない結果になることがあります。また、各レジスタはバイト/ワード/ロングワードのいずれの方法が可能か決まっており、許可されていない方法でアクセスすると意図しない結果になることがあります。CPUのハードウエアマニュアルをよく読んだ上で使用してください。
書式1:
書式2:
書式3:
<番地>が指すメモリの、<ビット位置>で指定されるビットを0にします。
書式1の場合<番地>はバイトアクセスされます。<ビット位置>の範囲は0〜7です。
書式2の場合<番地>はワードアクセスされます。<番地>が奇数番地だとエラーになります。<ビット位置>の範囲は0〜15です。
書式3の場合<番地>はロングワードアクセスされます。<番地>が4で割り切れない番地だとエラーになります。<ビット位置>の範囲は0〜31です。
書式1:
書式2:
書式3:
<ビット値>を省略した場合、<番地>が指すメモリの、<ビット位置>で指定されるビットを1にします。
<ビット値>を指定した場合、<番地>が指すメモリの、<ビット位置>に<ビット値>を代入します。<ビット値>が0ならそのビットを0に、0以外ならそのビットを1にします。
書式1の場合<番地>はバイトアクセスされます。<ビット位置>の範囲は0〜7です。
書式2の場合<番地>はワードアクセスされます。<番地>が奇数番地だとエラーになります。<ビット位置>の範囲は0〜15です。
書式3の場合<番地>はロングワードアクセスされます。<番地>が4で割り切れない番地だとエラーになります。<ビット位置>の範囲は0〜31です。
書式:
<開始番地>から<長さ>バイトだけメモリの内容を表示します。<長さ>は16バイト単位で切り上げられます。<長さ>を省略すると128バイトになります。
DUMP文実行中にCTRL-Cを押すと中断することができます。またCTRL-Sを押すと一時停止する事ができます。再開はCTRL-C以外のキーです(CTRL-Cだと中断します)。
書式:
<転送元先頭番地>から<長さ>バイトぶんのメモリの 内容を<転送先先頭番地>以降にに転送します。転送元と転送先の領域が重なっていても正しく転送されます。
バイト単位で転送しているので、ワード境界などは気にしなくても大丈夫です。
BASICのテキスト領域やBASICインタプリタの作業領域を壊さないよう、注意して使ってください。
書式:
メインメモリの、<開始番地>が指す番地以降にデータを書き込みます。
最初に <変数>= と書いた場合、POKE文実行後に、データを最後に書き込んだ番地+1が変数に代入されます。
<POKE要素並び>とはメモリに書き込みたい要素を ,(コンマ)で区切って並べたものです。要素としては以下のものがあります。
・数式
・%数式
・#数式
・!%数式
・!#数式
・"(クオーテーション)で囲まれた文字列
普通に数式を書くと1バイト単位で書き込まれますが、数式の前に %(パーセント)をつけた場合、数式の値が2バイトで、#(シャープ)をつけた場合4バイトで書き込まれます。2バイトまたは4バイトの書き込みは番地が偶数でないと ALIGN ERROR になります。
% または # の前にさらに !(エクスクラメーション)を付けると、番地が偶数でない場合自動的に番地に1を加算し、必ず偶数番地に書きこみます。スキップされた番地には何も書きこみません。
"(クオーテーション)で囲った文字列を書くとその文字列がそのまま書き込まれます。
POKE文の例:
POKE $FFFFF600,1,2,3,4,5 |
書式:
シリアルターミナルのキーボードから数値を入力し、変数に代入します。"文字列", があると、その文字列が入力前に表示されます。入力の際、頭に $(ドル)を付けることによって16進数も入力できます。
以下の点が旧来のBASICとは異なります。
・実行時 ?(クエスチョンマーク)は表示されない ・入力されたものが数値とみなすことができない場合、変数の値が変化しないだけで、特にメッセージ等は出ない。 ・ダイレクトモードでは実行できない。 BAD MODE エラーになる。 |
書式1:
書式2:
シリアルターミナルの画面に文字列、数値等を表示します。書式1、2のどちらも実行結果は同じです。出力要素並びとは、出力要素を ,(コンマ)で区切って並べたものです。
? はLIST表示時にも ? のままです。 |
CHR(<式>) |
<式>の値をアスキーコードとする文字を出力します。 |
CSTR(<番地>) |
<番地>が指す「C言語風文字列」(0で終わる文字列)を出力します。 |
HEX(<式>) |
<式>の値の下位8ビットを16進2桁で出力します。 |
HEX%(<式>) |
<式>の値を下位16ビットを16進4桁で出力します。 |
HEX#(<式>) |
<式>の値を16進8桁で出力します。 |
HEX@(<番地>) |
<番地>が指す1バイトのメモリの内容を16進2桁で出力します。 |
HEX%@(<番地>) |
<番地>が指す2バイトのメモリの内容を16進4桁で出力します。 |
HEX#@(<番地>) |
<番地>が指す4バイトのメモリの内容を16進8桁で出力します。 |
LSET(<式>,<桁数>) |
<式>の値を、指定された<桁数>で、左詰めで表示します。<桁数>は、符号も含めた桁数ですので、数字部分の桁数は<桁数>-1になります。たとえば、-999から999までの範囲の数値を表示したい場合、桁数には4以上の値を指定する必要があります。 |
RSET(<式>,<桁数>) |
式の値を、指定された桁数で、右詰めで表示します。右詰めになること以外はLSETと同じですので、詳しくはLSETの項を参照してください。 |
SPC(<式>) |
<式>の値の個数だけ空白を出力します。 |
USGN(<式>) |
<式>の値を符号無し数値とみなして出力します。 |
書式:
'(シングルクオート)で始まる文は注釈文となります。シングルクオートから行末までを注釈とみなし実行しません。:(コロン)も注釈とみなされるため、注釈文の後ろに他の文を書くことはできません。
REM は使えません。 |
書式:
*(アスタリスク)に空白を入れずに続けて8文字以下の英字または数字を書くと、ラベル文になります。その行にラベルを付ける役割を果たします。ラベルはGOTO文やGOSUB文等の飛び先の目印になります。
ラベル文は行頭、すなわち行番号の直後になければいけません(行番号とラベル文の間に空白を入れるのは可)。行頭にないラベル文は、エラーにはなりませんが、ラベルとして認識されません。ラベル文の後に他の文を書くのは問題ありません。
同じラベルをプログラム中の複数の行に付けてもエラーにはなりませんが、認識されるのは一番行番号の小さいものだけです。GOTO/GOSUB等が思った場所に飛んでくれないときは、 LIST "*ラベル名" で、同じラベルを複数個所に付けていないかどうか確かめましょう。
ラベルは、プログラムに書いただけでは認識されていません。また、ラベル |
書式:
<変数名>で指定される変数に<式>の値を代入します。
書式:
式の値の絶対値を返します。
書式:
式の値の、<ビット位置>で指定されたビットの値を返します。<ビット位置>の範囲は0〜31です。
書式:
<番地>が指す1バイトのメモリの値の、<ビット位置>で指定されたビットの値を返します。<ビット位置>の範囲は0〜7です。
バイトアクセスが可能な番地に対して使用してください。
結局、BTST(PEEK(<番地>),<ビット位置>) と書くのとほぼ同じなのことなのですが、この組み合わせはSHの内蔵I/Oを操作する際に頻発するので1つの関数にまとめました。
書式:
<番地>が指す2バイトのメモリの値の、<ビット位置>で指定されたビットの値を返します。<ビット位置>の範囲は0〜15です。
ワードアクセスが可能な番地に対して使用してください。<番地>が奇数番地だとエラーになります。
書式:
<番地>が指す4バイトのメモリの値の、<ビット位置>で指定されたビットの値を返します。<ビット位置>の範囲は0〜31です。
ロングワードアクセスが可能な番地に対して使用してください。<番地>が4で割り切れない番地だとエラーになります。
書式:
式の値の、全ビットを反転させた値を返します。
書式:
式の値の下位8ビットを符号付き数とみなして、それを32ビットの符号付き数に符号拡張した値を返します。
書式:
式の値の下位16ビットを符号付き数とみなして、それを32ビットの符号付き数に符号拡張した値を返します。
書式:
フリーエリアに関する情報を返します。フリーエリアとは、現在BASICインタプリタが使用していない領域です。
<式>の値により、以下のように返される値が異なります。
<式の値> |
返される値 |
0 |
フリーエリアの総バイト数 |
1 |
フリーエリアの先頭番地 |
2 |
フリーエリアの最終番地+1 |
旧来のBASICとはかなり仕様が異なります。 |
書式:
シリアルターミナルから1文字だけ文字を受け取り、その文字コードを返します。
<式>には入力待ちの有無を指定します。<式>の値が1だと、シリアルターミナル側でキーが押されるまで待ちます。0だといわゆるリアルタイムキー入力となり、何かキーが押されていればその文字コードを返し、何もキーが押されていなければ0を返します。
書式:
式の値の符号を反転した値を返します。
書式:
式の値が0なら1を返し、0以外なら0を返します。全ビット反転ではないので注意してください。
書式:
メモリの、式が指す番地の1バイトの値を読んで返します。
書式:
メモリの、式が指す番地の2バイトの値を読んで返します。<式>が偶数番地を指していないとエラーになります。
書式:
メモリの、式が指す番地の4バイトの値を読んで返します。<式>が4で割り切れる番地を指していないとエラーになります。
書式:
USR関数を使用したあと、マシン語ルーチンが返したレジスタの値を返します。<式>の値が0〜12の場合はR0〜R12の値を、−1ならSRの値を返します。
書式:
式の値がマイナスなら−1、0なら0、プラスなら1を返します。
書式:
<式>が指す番地にあるC言語風文字列(0で終る文字列)の長さを調べて返します。
書式:
<番地>で指定されたマシン語ルーチンを呼び出します。<番地>は偶数番地でないとエラーになります。
<パラメータ並び>に数式をコンマで区切って書くとCPUのレジスタR0〜R12に値を渡すことができます。<パラメータ並び>には13個まで数式を書くことができます。それぞれ順にR0からR12に対応します。数式は13個全部書く必要はなく、書いたところまでレジスタに代入されます。ただし、途中を省略することはできません。
旧来のBASICとかなり仕様が違うので注意してください!!! |
SHの汎用レジスタはR0〜R14までの15個(R15はスタックポインタ)ですが、そんなにパラメータの多いマシン語ルーチンをBASICから呼び出すことはまずないだろうと思い、R12までにしています。 |
10 POKE $FFFFF600,%$301C ' ADD R1,R0 20 POKE $FFFFF602,%$000B ' ADD R2,R0 30 POKE $FFFFF604,%$302C ' RTS 40 POKE $FFFFF606,%$0009 ' NOP 50 ?USR($FFFFF600,100,200,300) ' R0=100,R1=200,R2=300,RETURN R0+R1+R2 60 ?HEX#(REG(-1)) ' VALUE OF SR |
ALIGN ERROR |
POKE文、PEEK%関数などで奇数番地をワードアクセスしようとした、あるいは4で割り切れない番地をロングワードアクセスしようとした |
BAD LABEL |
ラベル名が正しくない |
BAD LINE NO. |
行番号の指定が間違っている |
BAD MODE |
ダイレクトモードで実行できない文(現時点ではINPUT文のみ)を実行しようとした |
DEVIDE BY ZERO |
0で除算している |
ILLEGAL FUNCTION CALL |
文、関数等のパラメータの値が正しくない |
OUT OF LABELSPACE |
ラベル格納領域が不足している |
OUT OF MEMORY |
プログラム用の領域が不足している |
OUT OF WORKSPACE |
内部作業領域が不足している(式が複雑すぎる、サブルーチン、構造化IF構文、ループ構文などのネストが深すぎる) |
STRUCURE NEST ERROR |
GOSUB文とRETURN文、ループ構文、構造化IF構文の対応が正しくない |
SYNTAX ERROR |
文法間違い |
UNEXPECTED END |
予期しないプログラムの終了(ループ構文などを閉じないままプログラムが終了した) |
BASICインタプリタではなく、CPUのハードウエアが検出するエラーです。基本的にUSR関数で呼んだマシン語ルーチン中にバグがあった場合に出るメッセージです。
ADDRES ERROR |
アドレスエラー、ワード/ロングワード境界があってない、内蔵I/O領域で命令を実行しようとした、等 |
BAD INSTRUCTION |
未定義の命令コードを実行しようとした |
BAD DELEYED SLOT |
遅延スロットに不当な命令がある |
※ご注意 一応、すべてのSH7047の内蔵I/Oレジスタのアドレスを定数として用意していますが、これらの中には不用意に操作するとCPUが暴走したり、内蔵ROMの内容が消えてしまったりするものもありますので十分注意して使用してください。
また、シリアルコミュニケーションインターフェース(SCI)のチャネル1は、BASICインタプリタが常時アクセスしていますので、BASICプログラムでPOKE文等で直接アクセスして使用することはできません。
定数名 |
値 |
レジスタの正式名称 |
&SMR_2 |
$FFFF81C0 |
シリアルモードレジスタ_2 |
&BRR_2 |
$FFFF81C1 |
ビットレートレジスタ_2 |
&SCR_2 |
$FFFF81C2 |
シリアルコントロールレジスタ_2 |
&TDR_2 |
$FFFF81C3 |
トランスミッタデータレジスタ_2 |
&SSR_2 |
$FFFF81C4 |
シリアルステータスレジスタ_2 |
&RDR_2 |
$FFFF81C5 |
レシーブデータレジスタ_2 |
&SDCR_2 |
$FFFF81C6 |
シリアルディレクションコントロールレジスタ_2 |
&SMR_3 |
$FFFF81D0 |
シリアルモードレジスタ_3 |
&BRR_3 |
$FFFF81D1 |
ビットレートレジスタ_3 |
&SCR_3 |
$FFFF81D2 |
シリアルコントロールレジスタ_3 |
&TDR_3 |
$FFFF81D3 |
トランスミッタデータレジスタ_3 |
&SSR_3 |
$FFFF81D4 |
シリアルステータスレジスタ_3 |
&RDR_3 |
$FFFF81D5 |
レシーブデータレジスタ_3 |
&SDCR_3 |
$FFFF81D6 |
シリアルディレクションコントロールレジスタ_3 |
&SMR_4 |
$FFFF81E0 |
シリアルモードレジスタ_4 |
&BRR_4 |
$FFFF81E1 |
ビットレートレジスタ_4 |
&SCR_4 |
$FFFF81E2 |
シリアルコントロールレジスタ_4 |
&TDR_4 |
$FFFF81E3 |
トランスミッタデータレジスタ_4 |
&SSR_4 |
$FFFF81E4 |
シリアルステータスレジスタ_4 |
&RDR_4 |
$FFFF81E5 |
レシーブデータレジスタ_4 |
&SDCR_4 |
$FFFF81E6 |
シリアルディレクションコントロールレジスタ_4 |
定数名 |
値 |
レジスタの正式名称 |
&TCR_3 |
$FFFF8200 |
タイマコントロールレジスタ_3 |
&TCR_4 |
$FFFF8201 |
タイマコントロールレジスタ_4 |
&TMDR_3 |
$FFFF8202 |
タイマモードレジスタ_3 |
&TMDR_4 |
$FFFF8203 |
タイマモードレジスタ_4 |
&TIORH_3 |
$FFFF8204 |
タイマI/OレジスタH_3 |
&TIORL_3 |
$FFFF8205 |
タイマI/OレジスタL_3 |
&TIORH_4 |
$FFFF8206 |
タイマI/OレジスタH_4 |
&TIORL_4 |
$FFFF8207 |
タイマI/OレジスタL_4 |
&TIER_3 |
$FFFF8208 |
タイマインタラプトイネーブルレジスタ_3 |
&TIER_4 |
$FFFF8209 |
タイマインタラプトイネーブルレジスタ_4 |
&TOER |
$FFFF820A |
タイマアウトプットマスタイネーブルレジスタ |
&TOCR |
$FFFF820B |
タイマアウトプットコントロールレジスタ |
&TGCR |
$FFFF820D |
タイマゲートコントロールレジスタ |
&TCNT_3 |
$FFFF8210 |
タイマカウンタ_3 |
&TCNT_4 |
$FFFF8212 |
タイマカウンタ_4 |
&TCDR |
$FFFF8214 |
タイマ周期データレジスタ |
&TDDR |
$FFFF8216 |
タイマデッドタイムデータレジスタ |
&TGRA_3 |
$FFFF8218 |
タイマジェネラルレジスタA_3 |
&TGRB_3 |
$FFFF821A |
タイマジェネラルレジスタB_3 |
&TGRA_4 |
$FFFF821C |
タイマジェネラルレジスタA_4 |
&TGRB_4 |
$FFFF821E |
タイマジェネラルレジスタB_4 |
&TCNTS |
$FFFF8220 |
タイマサブカウンタ |
&TCBR |
$FFFF8222 |
タイマ周期バッファレジスタ |
&TGRC_3 |
$FFFF8224 |
タイマジェネラルレジスタC_3 |
&TGRD_3 |
$FFFF8226 |
タイマジェネラルレジスタD_3 |
&TGRC_4 |
$FFFF8228 |
タイマジェネラルレジスタC_4 |
&TGRD_4 |
$FFFF822A |
タイマジェネラルレジスタD_4 |
&TSR_3 |
$FFFF822C |
タイマステータスレジスタ_3 |
&TSR_4 |
$FFFF822D |
タイマステータスレジスタ_4 |
&TSTR |
$FFFF8240 |
タイマスタートレジスタ |
&TSYR |
$FFFF8241 |
タイマシンクロレジスタ |
&TCR_0 |
$FFFF8260 |
タイマコントロールレジスタ_0 |
&TMDR_0 |
$FFFF8261 |
タイマモードレジスタ_0 |
&TIORH_0 |
$FFFF8262 |
タイマI/OレジスタH_0 |
&TIORL_0 |
$FFFF8263 |
タイマI/OレジスタL_0 |
&TIER_0 |
$FFFF8264 |
タイマインタラプトイネーブルレジスタ_0 |
&TSR_0 |
$FFFF8265 |
タイマステータスレジスタ_0 |
&TCNT_0 |
$FFFF8266 |
タイマカウンタ_0 |
&TGRA_0 |
$FFFF8268 |
タイマジェネラルレジスタA_0 |
&TGRB_0 |
$FFFF826A |
タイマジェネラルレジスタB_0 |
&TGRC_0 |
$FFFF826C |
タイマジェネラルレジスタC_0 |
&TGRD_0 |
$FFFF826E |
タイマジェネラルレジスタD_0 |
&TCR_1 |
$FFFF8280 |
タイマコントロールレジスタ_1 |
&TMDR_1 |
$FFFF8281 |
タイマモードレジスタ_1 |
&TIOR_1 |
$FFFF8282 |
タイマI/Oレジスタ_1 |
&TIER_1 |
$FFFF8284 |
タイマインタラプトイネーブルレジスタ_1 |
&TSR_1 |
$FFFF8285 |
タイマステータスレジスタ_1 |
&TCNT_1 |
$FFFF8286 |
タイマカウンタ_1 |
&TGRA_1 |
$FFFF8288 |
タイマジェネラルレジスタA_1 |
&TGRB_1 |
$FFFF828A |
タイマジェネラルレジスタB_1 |
&TCR_2 |
$FFFF82A0 |
タイマコントロールレジスタ_12 |
&TMDR_2 |
$FFFF82A1 |
タイマモードレジスタ_2 |
&TIOR_2 |
$FFFF82A2 |
タイマI/Oレジスタ_2 |
&TIER_2 |
$FFFF82A4 |
タイマインタラプトイネーブルレジスタ_2 |
&TSR_2 |
$FFFF82A5 |
タイマステータスレジスタ_2 |
&TCNT_2 |
$FFFF82A6 |
タイマカウンタ_2 |
&TGRA_2 |
$FFFF82A8 |
タイマジェネラルレジスタA_2 |
&TGRB_2 |
$FFFF82AA |
タイマジェネラルレジスタA_2 |
&ICSR1 |
$FFFF83C0 |
入力レベルコントロール/ステータスレジスタ1 |
&OCSR |
$FFFF83C2 |
出力レベルコントロール/ステータスレジスタ |
定数名 |
値 |
レジスタの正式名称 |
&IPRA |
$FFFF8348 |
インタラプトプライオリティレジスタA |
&IPRD |
$FFFF834E |
インタラプトプライオリティレジスタD |
&IPRE |
$FFFF8350 |
インタラプトプライオリティレジスタE |
&IPRF |
$FFFF8352 |
インタラプトプライオリティレジスタF |
&IPRG |
$FFFF8354 |
インタラプトプライオリティレジスタG |
&IPRH |
$FFFF8356 |
インタラプトプライオリティレジスタH |
&ICR1 |
$FFFF8358 |
割り込みコントロールレジスタ1 |
&ISR |
$FFFF835A |
IRQステータスレジスタ |
&IPRI |
$FFFF835C |
インタラプトプライオリティレジスタI |
&IPRK |
$FFFF8360 |
インタラプトプライオリティレジスタK |
&ICR2 |
$FFFF8366 |
割り込みコントロールレジスタ2 |
定数名 |
値 |
レジスタの正式名称 |
&PADRL |
$FFFF8382 |
ポートAデータレジスタL |
&PAIORL |
$FFFF8386 |
ポートAI/OレジスタL |
&PACRL3 |
$FFFF838A |
ポートAコントロールレジスタ3 |
&PACRL1 |
$FFFF838C |
ポートAコントロールレジスタ1 |
&PACRL2 |
$FFFF838E |
ポートAコントロールレジスタ2 |
&PBDR |
$FFFF8390 |
ポートBデータレジスタ |
&PBIOR |
$FFFF8394 |
ポートBI/Oレジスタ |
&PBCR1 |
$FFFF8398 |
ポートBコントロールレジスタ1 |
&PBCR2 |
$FFFF839A |
ポートBコントロールレジスタ2 |
&PDDRL |
$FFFF83A2 |
ポートDデータレジスタL |
&PDIORL |
$FFFF83A6 |
ポートDI/OレジスタL |
&PDCRL1 |
$FFFF83AC |
ポートDコントロールレジスタL1 |
&PDCRL2 |
$FFFF83AE |
ポートDコントロールレジスタL2 |
&PEDRL |
$FFFF83B0 |
ポートEデータレジスタL |
&PFDR |
$FFFF83B2 |
ポートFデータレジスタ |
&PEIORL |
$FFFF83B4 |
ポートEI/OレジスタL |
&PEIORH |
$FFFF83B6 |
ポートEI/OレジスタH |
&PECRL1 |
$FFFF83B8 |
ポートEコントロールレジスタL1 |
&PECRL2 |
$FFFF83BA |
ポートEコントロールレジスタL2 |
&PECRH |
$FFFF83BC |
ポートEコントロールレジスタH |
&PEDRH |
$FFFF83BE |
ポートEデータレジスタH |
定数名 |
値 |
レジスタの正式名称 |
&CMSTR |
$FFFF83D0 |
コンペアマッチタイマスタートレジスタ |
&CMCSR_0 |
$FFFF83D2 |
コンペアマッチタイマコントロール/ステータスレジスタ_0 |
&CNT_0 |
$FFFF83D4 |
コンペアマッチタイマカウンタ_0 |
&CMCOR_0 |
$FFFF83D6 |
コンペアマッチタイマコンスタントレジスタ_0 |
&CMCSR_1 |
$FFFF83D8 |
コンペアマッチタイマコントロール/ステータスレジスタ_1 |
&CMCNT_1 |
$FFFF83DA |
コンペアマッチタイマカウンタ_1 |
&CMCOR_1 |
$FFFF83DC |
コンペアマッチタイマコンスタントレジスタ_1 |
定数名 |
値 |
レジスタの正式名称 |
&ADDR0 |
$FFFF8420 |
A/Dデータレジスタ0 |
&ADDR1 |
$FFFF8422 |
A/Dデータレジスタ1 |
&ADDR2 |
$FFFF8424 |
A/Dデータレジスタ2 |
&ADDR3 |
$FFFF8426 |
A/Dデータレジスタ3 |
&ADDR4 |
$FFFF8428 |
A/Dデータレジスタ4 |
&ADDR5 |
$FFFF842A |
A/Dデータレジスタ5 |
&ADDR6 |
$FFFF842C |
A/Dデータレジスタ6 |
&ADDR7 |
$FFFF842E |
A/Dデータレジスタ7 |
&ADDR8 |
$FFFF8430 |
A/Dデータレジスタ8 |
&ADDR9 |
$FFFF8432 |
A/Dデータレジスタ9 |
&ADDR10 |
$FFFF8434 |
A/Dデータレジスタ10 |
&ADDR11 |
$FFFF8436 |
A/Dデータレジスタ11 |
&ADDR12 |
$FFFF8438 |
A/Dデータレジスタ12 |
&ADDR13 |
$FFFF843A |
A/Dデータレジスタ13 |
&ADDR14 |
$FFFF843C |
A/Dデータレジスタ14 |
&ADDR15 |
$FFFF843E |
A/Dデータレジスタ15 |
&ADCSR_0 |
$FFFF8480 |
A/Dコントロール/ステータスレジスタ_0 |
&ADCSR_1 |
$FFFF8481 |
A/Dコントロール/ステータスレジスタ_1 |
&ADCR_0 |
$FFFF8488 |
A/Dコントロールレジスタ_0 |
&ADCR_1 |
$FFFF8489 |
A/Dコントロールレジスタ_1 |
&ADTSR |
$FFFF87F4 |
A/Dトリガセレクトレジスタ |
定数名 |
値 |
レジスタの正式名称 |
&FLMCR1 |
$FFFF8580 |
フラッシュメモリコントロールレジスタ1 |
&FLMCR2 |
$FFFF8581 |
フラッシュメモリコントロールレジスタ2 |
&EBR1 |
$FFFF8582 |
消去ブロック指定レジスタ1 |
&EBR2 |
$FFFF8583 |
消去ブロック指定レジスタ2 |
定数名 |
値 |
レジスタの正式名称 |
&UBARH |
$FFFF8600 |
ユーザーブレークアドレスレジスタ_H |
&UBARL |
$FFFF8602 |
ユーザーブレークアドレスレジスタ_L |
&UBAMRH |
$FFFF8604 |
ユーザーブレークアドレスマスクレジスタ_H |
&UBAMRL |
$FFFF8606 |
ユーザーブレークアドレスマスクレジスタ_L |
&UBBR |
$FFFF8608 |
ユーザーブレークバスサイクルレジスタ |
&UBCR |
$FFFF860A |
ユーザーブレークコントロールレジスタ |
定数名 |
値 |
レジスタの正式名称 |
&TCSR |
$FFFF8610 |
タイマコントロール/ステータスレジスタ |
&TCNT |
$FFFF8611 |
タイマカウンタ |
&RSTCSR |
$FFFF8613 |
リセットコントロール/ステータスレジスタ |
定数名 |
値 |
レジスタの正式名称 |
&SBYCR |
$FFFF8614 |
スタンバイコントロールレジスタ |
&SYSCR |
$FFFF8618 |
システムコントロールレジスタ |
&MSTCR1 |
$FFFF861C |
モジュールスタンバイコントロールレジスタ1 |
&MSTCR2 |
$FFFF861E |
モジュールスタンバイコントロールレジスタ2 |
定数名 |
値 |
レジスタの正式名称 |
&BCR1 |
$FFFF8620 |
バスコントロールレジスタ1 |
&BCR2 |
$FFFF8622 |
バスコントロールレジスタ2 |
&WCR1 |
$FFFF8624 |
ウエイトコントロールレジスタ1 |
&RAMER |
$FFFF8628 |
RAMエミュレーションレジスタ |
定数名 |
値 |
レジスタの正式名称 |
&DTEA |
$FFFF8700 |
DTCイネーブルレジスタA |
&DTEB |
$FFFF8701 |
DTCイネーブルレジスタB |
&DTEC |
$FFFF8702 |
DTCイネーブルレジスタC |
&DTED |
$FFFF8703 |
DTCイネーブルレジスタD |
&DTCSR |
$FFFF8706 |
DTCコントロール/ステータスレジスタ |
&DTBR |
$FFFF8708 |
DTC情報ベースレジスタ |
&DTEE |
$FFFF8710 |
DTCイネーブルレジスタE |
&DTEF |
$FFFF8711 |
DTCイネーブルレジスタF |
定数名 |
値 |
レジスタの正式名称 |
&ICSR2 |
$FFFF83C4 |
入力レベルコントロール/ステータスレジスタ2 |
&MMT_TMDR |
$FFFF8A00 |
タイマモードレジスタ |
&TCNR |
$FFFF8A02 |
タイマコントロールレジスタ |
&MMT_TSR |
$FFFF8A04 |
タイマステータスレジスタ |
&MMT_TCNT |
$FFFF8A06 |
タイマカウンタ |
&TPDR |
$FFFF8A08 |
タイマピリオドデータレジスタ |
&TPBR |
$FFFF8A0A |
タイマピリオドバッファレジスタ |
&MMT_TDDR |
$FFFF8A0C |
タイマデッドタイムデータレジスタ |
&TBRU_B |
$FFFF8A10 |
タイマバッファレジスタU_B |
&TGRUU |
$FFFF8A12 |
タイマジェネラルレジスタUU |
&TGRU |
$FFFF8A14 |
タイマジェネラルレジスタU |
&TGRUD |
$FFFF8A16 |
タイマジェネラルレジスタUD |
&TDCNT0 |
$FFFF8A18 |
タイマデッドタイムカウンタ0 |
&TDCNT1 |
$FFFF8A1A |
タイマデッドタイムカウンタ1 |
&TBRU_F |
$FFFF8A1C |
タイマバッファレジスタU_F |
&TBRV_B |
$FFFF8A20 |
タイマバッファレジスタV_B |
&TGRVU |
$FFFF8A22 |
タイマジェネラルレジスタVU |
&TGRV |
$FFFF8A24 |
タイマジェネラルレジスタU |
&TGRVD |
$FFFF8A26 |
タイマジェネラルレジスタVD |
&TDCNT2 |
$FFFF8A28 |
タイマデッドタイムカウンタ2 |
&TDCNT3 |
$FFFF8A2A |
タイマデッドタイムカウンタ3 |
&TBRV_F |
$FFFF8A2C |
タイマバッファレジスタV_F |
&TBRW_B |
$FFFF8A30 |
タイマバッファレジスタW_B |
&TGRWU |
$FFFF8A32 |
タイマジェネラルレジスタWU |
&TGRW |
$FFFF8A34 |
タイマジェネラルレジスタW |
&TGRWD |
$FFFF8A36 |
タイマジェネラルレジスタWD |
&TDCNT4 |
$FFFF8A38 |
タイマデッドタイムカウンタ4 |
&TDCNT5 |
$FFFF8A3A |
タイマデッドタイムカウンタ5 |
&TBRW_F |
$FFFF8A3C |
タイマバッファレジスタW_F |
定数名 |
値 |
レジスタの正式名称 |
&SDIR |
$FFFF8A50 |
インストラクションレジスタ |
&SDSR |
$FFFF8A52 |
ステータスレジスタ |
&SDDRH |
$FFFF8A54 |
データレジスタH |
&SDDRL |
$FFFF8A56 |
データレジスタL |
定数名 |
値 |
レジスタの正式名称 |
&MCR |
$FFFFB000 |
マスタコントロールレジスタ |
&GSR |
$FFFFB002 |
ジェネラルステータスレジスタ |
&HCAN2_BCR1 |
$FFFFB004 |
ビットタイミングコンフィグレーションレジスタ1 |
&HCAN2_BCR0 |
$FFFFB006 |
ビットタイミングコンフィグレーションレジスタ1 |
&IRR |
$FFFFB008 |
インタラプトレジスタ |
&IMR |
$FFFFB00A |
インタラプトマスクレジスタ |
&TEC |
$FFFFB00C |
送信エラーカウントレジスタ |
&REC |
$FFFFB00D |
受信エラーカウントレジスタ |
&TXPR1 |
$FFFFB020 |
送信待ちレジスタ1 |
&TXPR0 |
$FFFFB022 |
送信待ちレジスタ0 |
&TXCR1 |
$FFFFB028 |
送信待ち取り消しレジスタ1 |
&TXCR0 |
$FFFFB02A |
送信待ち取り消しレジスタ0 |
&TXACK1 |
$FFFFB030 |
送信アクノレッジレジスタ1 |
&TXACK0 |
$FFFFB032 |
送信アクノレッジレジスタ0 |
&ABACK1 |
$FFFFB038 |
取り消しアクノレッジレジスタ1 |
&ABACK0 |
$FFFFB03A |
取り消しアクノレッジレジスタ0 |
&RXPR1 |
$FFFFB040 |
受信完了レジスタ1 |
&RXPR0 |
$FFFFB042 |
受信完了レジスタ0 |
&RFPR1 |
$FFFFB048 |
リモートリクエストレジスタ1 |
&RFPR0 |
$FFFFB04A |
リモートリクエストレジスタ0 |
&MBIMR1 |
$FFFFB050 |
メールボックスインタラプトマスクレジスタ1 |
&MBIMR0 |
$FFFFB052 |
メールボックスインタラプトマスクレジスタ0 |
&UMSR1 |
$FFFFB058 |
未読メッセージステータスレジスタ1 |
&UMSR0 |
$FFFFB05A |
未読メッセージステータスレジスタ2 |
&TCNTR |
$FFFFB080 |
タイマカウンタレジスタ |
&TCR |
$FFFFB082 |
タイマコントロールレジスタ |
&TSR |
$FFFFB084 |
タイマステータスレジスタ |
&LOSR |
$FFFFB088 |
ローヤルオフセットレジスタ |
&HCNA2_ICR0 |
$FFFFB08C |
インプットキャプチャレジスタ0 |
&HCAN2_ICR1 |
$FFFFB08E |
インプットキャプチャレジスタ1 |
&TCMR0 |
$FFFFB090 |
タイマコンペアマッチレジスタ0 |
&TCMR1 |
$FFFFB092 |
タイマコンペアマッチレジスタ1 |
&MB0 |
$FFFFB100 |
メールボックス0 |
&MB1 |
$FFFFB120 |
メールボックス1 |
&MB2 |
$FFFFB140 |
メールボックス2 |
&MB3 |
$FFFFB160 |
メールボックス3 |
&MB4 |
$FFFFB180 |
メールボックス4 |
&MB5 |
$FFFFB1A0 |
メールボックス5 |
&MB6 |
$FFFFB1C0 |
メールボックス6 |
&MB7 |
$FFFFB1E0 |
メールボックス7 |
&MB8 |
$FFFFB200 |
メールボックス8 |
&MB9 |
$FFFFB220 |
メールボックス9 |
&MB10 |
$FFFFB240 |
メールボックス10 |
&MB11 |
$FFFFB260 |
メールボックス11 |
&MB12 |
$FFFFB280 |
メールボックス12 |
&MB13 |
$FFFFB2A0 |
メールボックス13 |
&MB14 |
$FFFFB2C0 |
メールボックス14 |
&MB15 |
$FFFFB2E0 |
メールボックス15 |
&MB16 |
$FFFFB300 |
メールボックス16 |
&MB17 |
$FFFFB320 |
メールボックス17 |
&MB18 |
$FFFFB340 |
メールボックス18 |
&MB19 |
$FFFFB360 |
メールボックス19 |
&MB20 |
$FFFFB380 |
メールボックス20 |
&MB21 |
$FFFFB3A0 |
メールボックス21 |
&MB22 |
$FFFFB3C0 |
メールボックス22 |
&MB23 |
$FFFFB3E0 |
メールボックス23 |
&MB24 |
$FFFFB400 |
メールボックス24 |
&MB25 |
$FFFFB420 |
メールボックス25 |
&MB26 |
$FFFFB440 |
メールボックス26 |
&MB27 |
$FFFFB460 |
メールボックス27 |
&MB28 |
$FFFFB480 |
メールボックス28 |
&MB29 |
$FFFFB4A0 |
メールボックス29 |
&MB30 |
$FFFFB4C0 |
メールボックス30 |
&MB31 |
$FFFFB4E0 |
メールボックス31 |