この文章は超ミニBASIC for H8/3664の、インタプリタの中核部分の文法について説明したものです。キャラクタ液晶モジュールに関する文・関数については「超ミニBASIC キャラクタ液晶モジュールサポート」を参照してください。
以下の文章で、下にあるような枠で囲まれた文章は、超ミニBASICの内部構造を詳しく知りたい人向けに書いた文章です。内部構造に興味がない人は読み飛ばしても構いません。
|
|
超ミニBASIC for H8/3664はシリアルターミナル、またはパソコンのシリアルターミナルソフトから以下のようにして操作します。
プログラムを入力するには行番号に続けて文を入力してください。入力された行の先頭に数字があればそれはプログラムの入力と見なされ、メモリに貯えられます。
プログラムは入力した順ではなく、行番号の小さい順に並べ替えられてメモリに貯えられます。プログラムを実行する際にも、基本的には行番号の小さい行から順に実行されます。
LISTコマンドでプログラムリストを表示すると、行番号部分は右詰めで表示されます! |
メモリ上には、行番号以外はすべてテキストのまま格納しています。
|
コマンドを実行したい場合、または文を即時実行したい場合(これを文のダイレクトモード実行と言います)、行番号を付けずにコマンドまたは文を入力します。コマンドと文の違いは以下の点です。
使用可能なコマンドの一覧はこちら、文の一覧はこちらを参照してください。
超ミニBASICのプログラムは複数(1行でもかまわない)の行からなります。行は行番号と本文からなります。本文は複数(1つでも構わない)の文からなります。行の長さは160文字までで、160文字を越えたぶんは切り捨てられます。また、行末の空白も切り捨てられます。タブ(文字コード$09)は1個の空白に変換されます。
本文に複数の文を書くには、文を :(コロン)で区切って並べて書きます。これをマルチステートメントといいます。
行番号には、1〜65534までの数値を書きます。行の先頭の空白を除いた最初の数字の塊が行番号とみなされます。行番号より後ろの、行末までが本文とみなされます。
本文は、基本的には英大文字に変換されてメモリに貯えられます。ただし、"(ダブルクオート)で囲まれた文字列と、'(シングルクオート)から行末までの文字列は変換されません。
「行」の例:
100 FOR I=0 to 9 : PRINT I,"ABC" : NEXT 行番号 文 文 文 ← 本文 → |
数値は32ビット整数値です。扱える範囲は符号付きなら -2147483648〜2147483647 、符号無しなら 0〜4294967295 です。
数値の頭に $(ドル)を付けることによって16進数も扱うことができます。その場合、$ と数字の間にはスペースを入れないでください。
符号付き・符号無しは、数値に適用する演算子が符号付きか符号無しかによって決まります。数値自身は自分が符号付きなのかどうかを自覚していません。
オーバーフローは検出しません。オーバーフローした場合下位32ビットのみが有効になります。たとえば、 $80000000+$80000000 は 0 です。
H8の内蔵I/Oのアドレスを表す定数です。 定数の一覧はこちらを見てください。
例:&PCR1 (ポートコントロールレジスタ1、値は $FFE4 )
変数は、単純変数のみです。配列変数や文字列変数はありません。変数名は英字1文字で、全部で26個あります。ちょっと少ないようですが、サブルーチンではローカル変数を使うことができるので、大昔のtinyBASICよりはかなり制約は少なくなっています。
以下のものがあります。レベルの高いものほど優先度は高くなります。
レベル1(比較系) |
= <> > < >= <= _> _< _>= _<= |
レベル2(加減算系) |
+ - OR XOR |
レベル3(乗除算系) |
* / _/ AND |
旧来のBASICとはかなり優先順位が異なりますので注意してください。特に注意すべきなのは AND OR 等が比較系の演算子より優先度が高いことです。たとえば「A=0で、なおかつB=0」なんて場合、旧来のBASIC感覚で
などと書くと期待した動作をしてくれません。面倒かもしれませんが
と書いてください。 |
<関数名>(<式>)の形をしているものを関数といいます。使用できる関数の一覧はこちらを見てください。
書式:
<開始行番号>から<終了行番号>までの行を削除します。
書式:
プログラムのリストを画面に表示します。
"<文字列>"を指定すると、その文字列を含む行のみ表示します。文字列の長さは半角で15文字までです。行番号部分は文字列検索の対象にはなりません。
行範囲を指定すると、指定範囲のみ表示します。もちろん、文字列と行範囲を両方指定することも可能で、その場合指定範囲内で文字列を含む行のみを表示します。
<行範囲>の指定の仕方には、以下の4つの書き方があります。
<行番号> |
行番号が一致する1行のみ |
<開始行番号>- |
開始行番号からプログラムの最後まで |
-<終了行番号> |
プログラムの先頭から終了行番号まで |
<開始行番号>-<終了行番号> |
開始行番号から終了行番号まで |
書式:
現在のメモリ上のプログラムを消去します。
書式:
行番号を付けなおします。
<旧行番号>で始まる行番号に、<新行番号>を付け、それ以降の行は<増分>づつ行番号を増やして行きます。
<新行番号>および<増分>は省略すると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 |
入出力文とは、H8/CPUのメモリや内蔵I/Oを操作する文や、シリアルターミナルに文字列や数値を表示したり、シリアルターミナルから数値を入力したりする文です。
・BCLR文、BSET文、POKE文に関する注意
これらの文で、不用意にBASICインタプリタの作業領域や、CPUのI/O領域を操作するとCPUが暴走する恐れがあります。十分注意して使用してください。(FRE関数の項も参考にしてください)
また、CPU内蔵ポートのポートコントロールレジスタなど、書き込み専用レジスタはBSET文、BCLR文では正しく扱えませんので注意してください。(CPUの仕様です)
書式:
<番地>が指す1バイトのメモリの、<ビット位置>で指定されるビットを0にします。<ビット位置>の範囲は0〜7です。
書式1:
書式2:
書式1の場合、<番地>が指す1バイトのメモリの、<ビット位置>で指定されるビットを1にします。
書式2の場合、<番地>が指す1バイトのメモリの、<ビット位置>に<ビット値>を代入します。<ビット値>が0ならそのビットを0に、0以外ならそのビットを1にします。
いずれの場合も<ビット位置>の範囲は0〜7です。
書式:
<開始番地>から<長さ>バイトだけメモリの内容を表示します。<長さ>は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 $FA00,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 は使えません。 |
書式:
*(アスタリスク)に空白を入れずに続けて6文字以下の英字または数字を書くと、ラベル文になります。その行にラベルを付ける役割を果たします。ラベルはGOTO文やGOSUB文等の飛び先の目印になります。
ラベル文は行頭、すなわち行番号の直後になければいけません(行番号とラベル文の間に空白を入れるのは可)。行頭にないラベル文は、エラーにはなりませんが、ラベルとして認識されません。ラベル文の後に他の文を書くのは問題ありません。
同じラベルをプログラム中の複数の行に付けてもエラーにはなりませんが、認識されるのは一番行番号の小さいものだけです。GOTO/GOSUB等が思った場所に飛んでくれないときは、 LIST "*ラベル名" で、同じラベルを複数個所に付けていないかどうか確かめましょう。
ラベルは、プログラムに書いただけでは認識されていません。また、ラベル |
書式:
<変数名>で指定される変数に<式>の値を代入します。
書式:
式の値の絶対値を返します。
書式:
式の値の、<ビット位置>で指定されたビットの値を返します。<ビット位置>の範囲は0〜31です。
書式:
<番地>が指す1バイトのメモリの値の、<ビット位置>で指定されたビットの値を返します。<ビット位置>の範囲は0〜7です。
結局、BTST(PEEK(<番地>),<ビット位置>) と書くのとほぼ同じなのことなのですが、この組み合わせはH8の内蔵I/Oを操作する際に頻発するので1つの関数にまとめました。
書式:
式の値の、全ビットを反転させた値を返します。
書式:
式の値の下位8ビットを符号付き数とみなして、それを32ビットの符号付き数に符号拡張した値を返します。
書式:
式の値の下位16ビットを符号付き数とみなして、それを32ビットの符号付き数に符号拡張した値を返します。
書式:
フリーエリアに関する情報を返します。フリーエリアとは、現在BASICインタプリタが使用していない領域です。
<式>の値により、以下のように返される値が異なります。
<式の値> |
返される値 |
0 |
フリーエリアの総バイト数 |
1 |
フリーエリアの先頭番地 |
2 |
フリーエリアの最終番地+1 |
旧来のBASICとはかなり仕様が異なります。 |
書式:
シリアルターミナルから1文字だけ文字を受け取り、その文字コードを返します。
<式>には入力待ちの有無を指定します。<式>の値が1だと、シリアルターミナル側でキーが押されるまで待ちます。0だといわゆるリアルタイムキー入力となり、何かキーが押されていればその文字コードを返し、何もキーが押されていなければ0を返します。
書式:
式の値の符号を反転した値を返します。
書式:
式の値が0なら1を返し、0以外なら0を返します。全ビット反転ではないので注意してください。
書式:
メモリの、式が指す番地の1バイトの値を読んで返します。
書式:
メモリの、式が指す番地の2バイトの値を読んで返します。<式>が偶数番地を指していないとエラーになります。
書式:
メモリの、式が指す番地の4バイトの値を読んで返します。<式>が偶数番地を指していないとエラーになります。
書式:
USR関数を使用したあと、マシン語ルーチンが返したレジスタの値を返します。<式>の値が0〜6の場合はER0〜ER6の値を、−1ならCCRの値を返します。
書式:
式の値がマイナスなら−1、0なら0、プラスなら1を返します。
書式:
<式>が指す番地にあるC言語風文字列(0で終る文字列)の長さを調べて返します。
書式:
<番地>で指定されたマシン語ルーチンを呼び出します。<番地>は偶数番地でないとエラーになります。
<パラメータ並び>に数式をコンマで区切って書くとCPUのレジスタER0〜ER6に値を渡すことができます。<パラメータ並び>には7つまで数式を書くことができます。それぞれ順にER0からER6に対応します。数式は7つ全部書く必要はなく、書いたところまでレジスタに代入されます。ただし、途中を省略することはできません。
旧来のBASICとかなり仕様が違うので注意してください!!! |
1010 POKE $FA00,%$0A90 ' ADD.L ER1,ER0 1020 POKE $FA02,%$0AA0 ' ADD.L ER2,ER0 1030 POKE $FA04,%$5470 ' RTS 1040 ?USR($FA00,100,200,300) ' ER0=100,ER1=200,ER2=300,RETURN ER0+ER1+ER2 1050 ?HEX(REG(-1)) ' VALUE OF CCR |
ALIGN ERROR |
POKE文、PEEK%関数などで奇数番地をワードアクセスしようとした |
BAD LABEL |
ラベル名が正しくない |
BAD LINE NO. |
行番号の指定が間違っている |
BAD MODE |
ダイレクトモードで実行できない文(現時点ではINPUT文のみ)を実行しようとした |
DEVIDE BY ZERO |
0で除算している |
ILLEGAL FUNCTION CALL |
文、関数等のパラメータの値が正しくない |
LABEL NOT FOUND |
ラベルが見つからない |
OUT OF MEMORY |
プログラム用の領域が不足している |
OUT OF WORKSPACE |
内部作業領域が不足している(式が複雑すぎる、サブルーチン、構造化IF構文、ループ構文などのネストが深すぎる) |
STRUCURE NEST ERROR |
GOSUB文とRETURN文、ループ構文、構造化IF構文の対応が正しくない |
SYNTAX ERROR |
文法間違い |
UNEXPECTED END |
予期しないプログラムの終了(ループ構文などを閉じないままプログラムが終了した) |
※ご注意 一応、すべてのH8/3664の内蔵I/Oレジスタのアドレスを定数として用意していますが、これらの中には不用意に操作するとCPUが暴走したり、内蔵ROMの内容が消えてしまったりするものもありますので十分注意して使用してください。
また、シリアルコミュニケーションインターフェース(SCI)は、BASICインタプリタが常時アクセスしていますので、BASICプログラムでPOKE文等で直接アクセスして使用することはできません。(PRINT文、INPUT文による入出力は可)
内蔵I/O機能ブロック |
定数名 |
値 |
レジスタの正式名称 |
タイマW |
&TMRW |
$FF80 |
タイマモードレジスタW |
&TCRW |
$FF81 |
タイマコントロールレジスタW | |
&TIERW |
$FF82 |
タイマインタラプトイネーブルレジスタW | |
&TSRW |
$FF83 |
タイマステータスレジスタW | |
&TIOR0 |
$FF84 |
タイマI/Oコントロールレジスタ0 | |
&TIOR1 |
$FF85 |
タイマI/Oコントロールレジスタ1 | |
&TCNT |
$FF86 |
タイマカウンタ | |
&GRA |
$FF88 |
ジェネラルレジスタA | |
&GRB |
$FF8A |
ジェネラルレジスタB | |
&GRC |
$FF8C |
ジェネラルレジスタC | |
&GRD |
$FF8E |
ジェネラルレジスタD | |
内蔵フラッシュROM |
&FLMCR1 |
$FF90 |
フラッシュメモリコントロールレジスタ1 |
&FLMCR2 |
$FF91 |
フラッシュメモリコントロールレジスタ2 | |
&FLPWCR |
$FF92 |
フラッシュメモリパワーコントロールレジスタ | |
&EBR1 |
$FF93 |
ブロック指定レジスタ1 | |
&FENR |
$FF9B |
フラッシュメモリイネーブルレジスタ | |
タイマV |
&TCRV0 |
$FFA0 |
タイマコントロールレジスタV0 |
&TCSRV |
$FFA1 |
タイマコントロール/ステータスレジスタV | |
&TCORA |
$FFA2 |
タイムコンスタントレジスタA | |
&TCORB |
$FFA3 |
タイムコンスタントレジスタB | |
&TCNTV |
$FFA4 |
タイマカウンタV | |
&TCRV1 |
$FFA5 |
タイマコントロールレジスタV1 | |
タイマA |
&TMA |
$FFA6 |
タイマモードレジスタA |
&TCA |
$FFA7 |
タイマカウンタA | |
シリアルコミュニケーションインターフェース |
&SMR |
$FFA8 |
シリアルモードレジスタ |
&BRR |
$FFA9 |
ビットレートレジスタ | |
&SCR3 |
$FFAA |
シリアルコントロールレジスタ3 | |
&TDR |
$FFAB |
トランスミットデータレジスタ | |
&SSR |
$FFAC |
シリアルステータスレジスタ | |
&RDR |
$FFAD |
レシーブデータレジスタ | |
A/D変換器 |
&ADDRA |
$FFB0 |
A/DデータレジスタA |
&ADDRB |
$FFB2 |
A/DデータレジスタB | |
&ADDRC |
$FFB4 |
A/DデータレジスタC | |
&ADDRD |
$FFB6 |
A/DデータレジスタD | |
&ADCSR |
$FFB8 |
A/Dコントロール/ステータスレジスタ | |
&ADCR |
$FFB9 |
A/Dコントロールレジスタ | |
ウォッチドッグタイマ |
&TCSRWD |
$FFC0 |
タイマコントロール/ステータスレジスタ |
&TCWD |
$FFC1 |
タイマカウンタ | |
&TMWD |
$FFC2 |
タイマモードレジスタ | |
IICバス |
&ICCR |
$FFC4 |
IICバスコントロールレジスタ |
&ICSR |
$FFC5 |
IICバスステータスレジスタ | |
&ICDR |
$FFC6 |
IICバスデータレジスタ | |
&SARX |
$FFC6 |
第2スレーブアドレスレジスタ | |
&ICMR |
$FFC7 |
IICバスモードレジスタ | |
&SAR |
$FFC7 |
スレーブアドレスレジスタ | |
&TSCR |
$FFFC |
タイマシリアルコントロールレジスタ | |
アドレスブレーク |
&ABRKCR |
$FFC8 |
アドレスブレークコントロールレジスタ |
&ABRKSR |
$FFC9 |
アドレスブレークステータスレジスタ | |
&BARH |
$FFCA |
ブレークアドレスレジスタH | |
&BARL |
$FFCB |
ブレークアドレスレジスタL | |
&BDRH |
$FFCC |
ブレークデータレジスタH | |
&BDRL |
$FFCD |
ブレークデータレジスタL | |
I/Oポート |
&PUCR1 |
$FFD0 |
ポートプルアップコントロールレジスタ1 |
&PUCR5 |
$FFD1 |
ポートプルアップコントロールレジスタ5 | |
&PDR1 |
$FFD4 |
ポートデータレジスタ1 | |
&PDR2 |
$FFD5 |
ポートデータレジスタ2 | |
&PDR5 |
$FFD8 |
ポートデータレジスタ5 | |
&PDR7 |
$FFDA |
ポートデータレジスタ7 | |
&PDR8 |
$FFDB |
ポートデータレジスタ8 | |
&PDRB |
$FFDD |
ポートデータレジスタB | |
&PMR1 |
$FFE0 |
ポートモードレジスタ1 | |
&PMR5 |
$FFE1 |
ポートモードレジスタ5 | |
&PCR1 |
$FFE4 |
ポートコントロールレジスタ1 | |
&PCR2 |
$FFE5 |
ポートコントロールレジスタ2 | |
&PCR5 |
$FFE8 |
ポートコントロールレジスタ5 | |
&PCR7 |
$FFEA |
ポートコントロールレジスタ7 | |
&PCR8 |
$FFEB |
ポートコントロールレジスタ8 | |
省電力 |
&SYSCR1 |
$FFF0 |
システムコントロールレジスタ1 |
&SYSCR2 |
$FFF1 |
システムコントロールレジスタ2 | |
&MSTCR1 |
$FFF9 |
モジュールスタンバイコントロールレジスタ1 | |
割り込み |
&IEGR1 |
$FFF2 |
割り込みエッジセレクトレジスタ1 |
&IEGR2 |
$FFF3 |
割り込みエッジセレクトレジスタ2 | |
&IENR1 |
$FFF4 |
割り込みイネーブルレジスタ1 | |
&IRR1 |
$FFF6 |
割り込みフラグレジスタ1 | |
&IWPR |
$FFF8 |
ウェイクアップ割り込みフラグレジスタ |