
■ BASCOM-AVR (DEMO) の使用方法 ■ |
インライン・アセンブラ 関連の命令 |
$ASM |
BASICプログラムの中に、アセンブラのコードブロックを挿入します。 |
LOADADR |
変数が割り当てられているアドレスを、ペアレジスタにロードします。 (アセンブラ支援命令) |
LOADWORDADR |
ラベルが割り当てられているアドレスを、Zレジスタにロードします。 (アセンブラ支援命令) |
PUSHALL |
BASCOMによって使用が予測されるレジスタを、すべて待避します。 |
POPALL |
PUSHALL命令で待避したレジスタを、復帰します。 |
ADR |
ラベルのアドレスを作成します。 (ワード単位) (アセンブラ支援命令) |
ADR2 |
ラベルのアドレスを作成します。 (バイト単位) (アセンブラ支援命令) |
GETREG |
AVRの内部レジスターから 1バイトを読み出します。 |
SETREG |
AVRの内部レジスターに1バイトを書き込みます。 |
$NOTRANSFORM |
チップによってサポートされていないアセンブラ命令の自動変換を制御します。 |
CONFIG
EXTENDED_PORT |
アセンブラの記述で、拡張レジスターを使用する命令を自動変換する際に、
コンパイラに警告またはエラーを発生させる設定をします。 |
LOADADR |
一覧へ戻る |
変数が割り当てられているアドレスを、ペアレジスタにロードします。 (アセンブラ支援命令)
書式 |
Loadadr variable , register |
注釈 |
variable = |
アドレスを調べる変数の名前。 |
register = |
AVRのペアレジスター名。 ( X , Y , Z ) |
|
|
(例) |
|
Dim A As Byte |
' 使用する変数を宣言。 |
$asm |
' アセンブラ命令ブロックの開始。 |
Loadadr A , X |
' 変数Aのメモリーアドレスを、レジスターXにロード。 |
: |
' アセンブラの処理。 |
$end Asm |
' アセンブラ命令ブロックの終了。 |
|
|
LOADWORDADR |
一覧へ戻る |
ラベルが割り当てられているアドレスを、Zレジスタ(R30,R31)にロードします。 (アセンブラ支援命令)
書式 |
Loadwordadr label |
注釈 |
label = Zレジスタに、アドレスを読み込むラベル名。 |
・AVRのフラッシュ・メモリーは、ワード単位のアドレスを使用するため、メモリーに割り当てられたバイト
アドレスを見つけるためには、ラベル・アドレスを2倍する必要があります。
・この命令は、ラベルのアドレスに2を掛けたアドレスを、Zレジスタ(R30,R31)に読み込みます。
・RAMPZレジスタが使用可能なチップの場合は、RAMPZも設定されます。
・以下のようなアセンブラ・コードが生成されます。
LDI R30,Low(label * 2)
LDI R31,High(label * 2)
LDI R24,1 または CLR R24
STS RAMPZ, R24
|
PUSHALL |
一覧へ戻る |
BASCOMによって使用が予測されるレジスタを、すべて待避します。
・BASICとアセンブラを混合する場合、どのレジスタがBASCOMによって使用されるかがわかりません。
・ユーザーのアセンブラルーチンで、レジスタの確保が必要な場合は、個々のレジスタを待避するか、
PUSHALL命令で、すべてのレジスタを待避することができます。
・待避されるレジスターは、R0〜R5、R7、R10、R11、R16〜R31 です。
|
POPALL |
一覧へ戻る |
PUSHALL命令で待避したレジスタを、復帰します。
|
ADR |
一覧へ戻る |
ラベルのアドレスを作成します。 (ワード単位)
書式 |
ADR label |
注釈 |
label = アドレスを作成するラベル名。 |
・ADRはアセンブラ支援命令で、アセンブラ・ニーモニックです。
・指定されたラベルのワード・アドレスを、データ・テーブルに作成します。
|
ADR2 |
一覧へ戻る |
ラベルのアドレスを作成します。 (バイト単位)
書式 |
ADR2 label |
注釈 |
label = アドレスを作成するラベル名。 |
・ADR2はアセンブラ支援命令で、アセンブラ・ニーモニックです。
・指定されたラベルのバイト・アドレスを、データ・テーブルに作成します。
・AVRのフラッシュ・メモリーは、ワード単位のアドレスを使用するので、メモリーの1バイトを見つける
ためには、アドレスを2ずつ増加させる必要があります。
・このため、ADR2はラベルのアドレスに2を掛けたアドレスを作成します。
|
(例) |
|
Dim B As Byte |
' 使用する変数を宣言。 |
Restore Label |
' データ行を指定。 |
Read DATAPTR |
' 新たなデータ行を示すポインターを読み込む。 |
Read B : Print B |
' Label2行からデータを読み込み出力する。 |
End |
' プログラムの終了。 |
' |
' |
Label: |
' データ行。 |
$asm |
' アセンブラ命令ブロックの開始。 |
ADR2 label2 |
' 新たなラベルのアドレス(バイト単位)を作成。 |
NOP |
' ダミー |
$end Asm |
' アセンブラ命令ブロックの終了。 |
Label2: |
' 新しいデータ行。 |
Data 10 , 20 |
' データ。 |
|
|
GETREG |
一覧へ戻る |
AVRの内部レジスターから 1バイトを読み出します。
書式 |
variable = Getreg(register) |
注釈 |
variable = |
レジスターの内容が入る変数の名前。 |
register = |
レジスタの名前。 (R0〜R31 または レジスターの定義名) |
|
・ほとんどのAVRチップには、R0〜R31という名前の32個のレジスターがあります。
・GETREG命令は、指定されたレジスターの値を返します。
・PEEK命令とPOKE命令は、アドレスで動作します。
・また、Xmegaはアドレスのマップが異なるので、XmegaのHWレジスターを返します。
・GETREG命令とSETREG命令は、すべてのAVRチップでレジスターの読み書きを行います。
・バージョン2078以降では、すべての内部レジスター(R0〜R31)が通常のBYTE変数として使用できる
ようになりました。
・これは、BASIC命令で [Rx = value] と言う表記でレジスターに読み書きを行うことができることを
意味します。
・これはSETREG命令やGETREG命令を使うより便利です。
|
SETREG |
一覧へ戻る |
AVRの内部レジスターに1バイトを書き込みます。
書式 |
Setreg register , value |
注釈 |
register = |
レジスタの名前。 (R0〜R31 または レジスターの定義名) |
value = |
レジスターに書き込む定数または変数名。 |
|
・ほとんどのAVRチップには、R0〜R31という名前の32個のレジスターがあります。
・SETREG命令は、指定されたレジスターに値を書き込みます。
・PEEK命令とPOKE命令は、アドレスで動作します。
・また、Xmegaはアドレスのマップが異なるので、XmegaのHWレジスターを返します。
・GETREG命令とSETREG命令は、すべてのAVRチップでレジスターの読み書きを行います。
※ レジスターR0〜R15に定数を書き込む場合、コンパイラは内部的にR24を使用します。
・バージョン2078以降では、すべての内部レジスター(R0〜R31)が通常のBYTE変数として使用できる
ようになりました。
・これは、BASIC命令で [Rx = value] と言う表記でレジスターに読み書きを行うことができることを
意味します。
・これはSETREG命令やGETREG命令を使うより便利です。
|
$NOTRANSFORM |
一覧へ戻る |
チップによってサポートされていないアセンブラ命令の自動変換を制御します。
書式 |
$notransform status |
注釈 |
status = |
On |
- 変換をオフ(行わない)にする。 |
Off |
- 変換をオン(行う)に戻す。 |
|
・初期状態では、チップまたはレジスターでサポートされていないアセンブラ命令を、対応する別の
アセンブラ命令に自動的に変換します。
・例えば、IN命令とOUT命令は、64より小さいアドレスのハードウェア・レジスターにしか使えません。
・ほとんどのPORT用レジスターは、この下位アドレス空間に配置されていますが、拡張メモリーに
配置されたより多くのPORTを持つチップも多く存在します。
・このようなチップでは、拡張アドレスに対してINまたはOUT命令を使用するとエラーが発生します。
・そこで、コンパイラはIN命令をLDS命令に、OUT命令をSTS命令に変換します。
・SBISやSBIC命令を除き、変換にレジスターの使用が必要な場合は、レジスターR23が使用されます。
(これらの命令では、必要な場合にR0が使用されます)
・アセンブラのコードを開発する場合、命令の使い方が間違っているときに、エラーを出したいことが
あります。
・この目的のために、自動変換をオフにすることができます。
・[$NOTRANSFORM ON]は変換をオフにします。
・そして、[$NOTRANSFORM OFF]で、変換をオンに戻すことができます。
※ この操作は、あなた自身の部分的なコードにのみ使用してください。
※ Bascomのライブラリーは、CBI、SBI、SBIS、IN、OUT命令などを使用する場合に変換を必要と
するため、プログラム全体でこの指示を使用するとコンパイルができなくなります。
|
CONFIG EXTENDED_PORT |
一覧へ戻る |
アセンブラの記述で、拡張レジスターを使用する命令を自動変換する際に、コンパイラに警告
またはエラーを発生させる設定をします。
書式 |
Config Extended_port = status |
注釈 |
status = |
Warning |
- レポート・ファイルに警告が表示されます。 |
Error |
- エラーが発生し、コードはコンパイルされません。 |
|
・多くのAVRチップには、拡張されたレジスターがあります。
・AVRが設計された当初、設計者はハードウェア・レジスター用の十分な予備スペースを確保して
いませんでした。
・そこで、SRAMのメモリーを上位アドレスに移動し、&H5F以降のスペースをレジスターに使用する様に
改良されたのが、拡張レジスターです。
・これらのチップでは、SRAMは&H100以上のアドレスから始まります。
・しかし、いくつかの命令は下位の32アドレスのみで機能し、また&H3Fまでのアドレスでしか動作しない
命令も多くあります。
・アセンブラのIN,OUT,SBI,SBIC,SBIS命令などは、これらの拡張レジスターでは動作しないため、
コンパイラは必要に応じてこの命令を自動的に動作可能な命令の書式に変換を行います。
・INやOUT命令の場合は、LDSやSTS命令を代用することで、拡張レジスターにアクセスできるように
なります。
・しかし、ピンの状態をテストして分岐するSBICのような命令の場合は、一時的にピンの状態を保管
するためのレジスターが必要で、これにはレジスターR23が強制的に使用されます。
・この変換はコンパイラが自動で行うため、自分でアセンブラを書くときに警告やエラーを出したい
場合があります。(自身のプログラムでR23を使用していても、R23が勝手に変更されるため)
・そのようなときに、CONFIG EXTENDED_PORT命令を使用します。
|
|