PIC Assembler Version 3.0
Users Manual
■はじめに
最新のドキュメントはhttp://mypaso.com/にあります。
◇一般的に以下の順序で記述します。サンプルプログラム参照
[例]
123,456,-10,19999 123h,0afh,0ffh,0ff_eeh 11111b,0010010b,11_000_111b
x equ 08000h y equ x<<16 z equ y>>16
PAには括弧という一見配列のような変数を使用することができます。これは連続したレジスタを配列の 様に見せかけているだけで加算することと全く同じ扱いです。
x ds 2 ;---A--- add x[0],#1 ; 下位桁に1を加算 btfsc c ; Cが立っていないときはスキップ inc x[1] ; 上位桁に1を加算 ;---B--- add x,#1 ; 下位桁に1を加算 btfsc c ; Cが立っていないときはスキップ inc x+1 ; 上位桁に1を加算AのルーチンとBのルーチンの生成される機械語コードは全く同じものです。xという変数が2バイト変数で あることが区別し易いと思います。しかし落とし穴もあってxが1バイトで定義してあっても、x[1],x[2],x[3] のような使い方について警告やエラーを発したりはしません。将来にはチェックする機能も設けようとはしています。
概 要 | 命 令 | 備 考 | |
ファイルのインクルード | include | ||
現在のアドレスの設定 | org | ||
リセット時の開始アドレス | reset | 12ビットコアのデバイスのみ | |
プログラムの終了 | end | ※1 | |
(DATA用)EEPROMの初期値設定 | eedata | EEPROMデバイスのみ適用 | |
データの埋め込み(バイト) | db | 16F87x用 | |
データの埋め込み(ワード) | dw | 16F87x用 | |
シンボルの値代入(再定義可) | = | ||
シンボルの値代入(再定義不可) | equ | ||
発振子タイプ設定 | .osc | ||
ウォッチドッグタイマ設定 | .wdt | ||
パワーアップタイマ設定 | .pwrt | ||
ブラウンアウトディテクト設定 | .bod | ||
プロテクト設定 | .protect | ||
リストファイル出力許可 | .list | ||
リストファイル出力抑制 | .nlist |
括弧 | ( ) | ||
配列演算 | [ ] | 配列 | |
マイナス符号 | - | 単項演算子 | |
全ビット反転(NOT) | ~ | 単項演算子 | |
乗算・除算・剰余 | * / MOD | ||
加算・減算 | + - | ||
論理積 | & | ||
論理和 | | | ||
排他的論理和 | ^ | ||
シフト演算子 | << >> | <<が左,>>が右シフト | |
ビット修飾子 | . | ピリオド(ドット) |
◇アセンブラ定数一覧
現在のアドレス | $ | ||
現在の(DATA用)EEPROMのアドレス | % |
◇マクロ命令
マクロ | macro...endm | ※1 | |
繰り返し | repeat...endm | ※1 | |
条件アセンブル | if...else...endm |
◇条件アセンブル時の比較演算子一覧
イコール | = | ||
同じでない | != | ||
より大きい | > | ||
以上 | >= | ||
より小さい | < | ||
以下 | <= |
include {filename} .include {filename} |
ファイルのインクルード |
filenameで指定したファイルをインクルードします。filenameはダブルコーテーション・シングルコーテーションなどで括る必要はありません。includeの前のピリオドはあってもなくても構いません。 filenameで指定されたファイルは以下の順番でファイルを検索します。
include文はネストすることが可能です。 [例] include 16f84.h |
|
.{device name} | デバイス名の設定 |
プログラムのターゲットデバイスを設定します。(このプログラムの書き込まれるデバイス名を指定します。)
半角ピリオドの後にPICのデバイス名を指定します。"PIC"の文字は不要です。直接16c54,16f877のように指定します。 [例] .16f84 .16c74a .16f877この命令はプログラム中で必ず指定しなければなりません。この指定がないとリストファイル(*.lst)が作成できません。 |
|
org {address} | 現在のアドレスの設定 |
アセンブル時のPCをaddressに設定します。addressには定数の他、計算式、ラベルなどを記述することも可能です。
プログラムを指定したアドレスから記述したい場合や作業エリアの開始アドレスを指定する際に使用します。
[例] org 100h |
|
reset {address} | リセット時の動作開始アドレス指定 |
※この命令は16C5x,12C5xx専用の命令です。 デバイスリセット時の動作開始アドレスを設定します。 16C5x,12C5xxはりセット時プログラムカウンタは最上位アドレスを指しています。この命令でその最上位アドレスに引数で与えられたアドレスにジャンプする命令(=goto address)を自動生成する命令です。デバイス名を正しく指定していればデバイスのプログラムエリアの最上位アドレスを調べる必要はありません。 [例] reset reset_vector |
|
end .end |
プログラムの終了 |
プログラムの終了を表す命令です。これはアセンブルを中断しend以降の行はアセンブル対象とはしないという意味です。 プログラム的には何も命令を生成することはありません。 |
|
eeorg | DATA用EEPROMのアドレス指定 |
※この命令は16C84,16F84,16F877などデータ用EEPROMを持ったデバイス専用の命令です。 EEDATA命令でDATA用EEPROMの初期値をセットする際の開始アドレスを指定する命令です。 [例] eeorg 10h |
|
eedata {data,[data,...]} | DATA用EEPROMの初期値設定 |
※この命令は16C84,16F84,16F877などデータ用EEPROMを持ったデバイス専用の命令です。 eeorgで指定したアドレスから順に引数で指定した初期値をセットします。これは対応ライタ(プログラマ)でデバイスに書き込みを行うとプログラムの書き込みと同時にDATA用EEPROMにも値を書き込みます。 dataには定数,計算式,シンボルなどの他、文字列もセット可能です。 [例] eedata 100,200,50,100 eedata 'SAMPLE',13,10,0 |
|
{symbol} = {value[.value]} | シンボルの定義(再定義可) |
プログラム中で使用する定数を定義します。このシンボルはアセンブル時に全て引数で指定した値(value)に置き換わります。=文は同じシンボルを再定義することが可能で、後に設定した値が有効です。 valueは定数,計算式、他のシンボルなどが使用できます。 value.valueの形式はファイルレジスタのビット位置も同時に定義することが可能で、ビットセット・クリア・分岐などに利用可能です。下記サンプル参照 [例] busy_port = ra.5 ... wait btfsc busy_port ; ra.5のビットが0になったらループを抜ける goto wait[例] input_max = 100 max_bytes = (255-100)/8 |
|
{symbol} equ {value[.value]} | シンボルの定義(再定義不可) |
.osc {oscillator type} | 発振子タイプの設定 |
デバイスの発振タイプを設定を行います。この設定は必須ではありません。対応しているライターではファイルを読み込むと自動的に指定した発振タイプにセットされ、書き込みミスを避けられます。 oscillator typeはデバイスによって指定できるものが異なります。下記参照 oscillator type: 12c5xxシリーズ LP,XT,INTRC,EXTRC 上記以外 LP,XT,HS,RC [例] .osc xt |
|
.wdt {on|off} | ウォッチドッグタイマ設定 |
ウォッチドッグタイマの有効・無効の設定を行います。この設定は必須ではありません。対応しているライターではファイルを読み込むと自動的に指定したWDTにセットされ、書き込みミスを避けられます。 on...WDTを使用する。 off...WDTを使用しない |
|
.pwrt {on|off} | パワーアップタイマ設定 |
パワーアップタイマの有効・無効の設定を行います。この設定は必須ではありません。対応しているライターではファイルを読み込むと自動的に指定したPWRTにセットされ、書き込みミスを避けられます。 on...PWRTを使用する。 off...PWRTを使用しない |
|
.bod {on|off} | ブラウンアウトディテクト設定 |
ブラウンアウトディテクトの有効・無効の設定を行います。この設定は必須ではありません。対応しているライターではファイルを読み込むと自動的に指定したBODにセットされ、書き込みミスを避けられます。 on...BODを使用する。 off...BODを使用しない |
|
.protect {on|off} | プロテクト設定 |
デバイスにプロテクトを掛けるか、掛けないかの設定を行います。この設定は必須ではありません。対応しているライターではファイルを読み込むと自動的に指定したモードにセットされ、書き込みミスを避けられます。 on...プロテクトを掛ける off...プロテクトを掛けない。 |
|
.list | リストファイル出力許可 |
-l オプションで生成されるリストファイル(*.lst)にアセンブル結果を出力することを許可します。 |
|
.nlist | リストファイル出力抑制 |
-l オプションで生成されるリストファイル(*.lst)にアセンブル結果を出力することを禁止します。 |
|
db {data[,data...]} | バイトデータ |
引数で与えられた値をプログラムコードとしてアセンブルします。それぞれの引数は7ビットの値(0〜127又は-64〜63)の範囲になければなりません。これはプログラムコードが14ビットの為上位7ビット・下位7ビットに分けているためです。 db命令の引数は必ず偶数にしなければなりません。奇数個の場合はエラーとしています。この場合は0を最後に付加するなどして調整してください。 [例] db 10,20,30,40 db 'AB' db 'A',10h,'B',10h |
|
dw {data[,data...]} | ワードデータ |
db命令をほとんど同じですが、dwは1つの引数を1つのプログラムコードとしてアセンブルします。それぞれの引数の値の範囲は0〜16384又は-8192〜8191です。 [例] dw 10000 dw 100,-100,1000,-1000 |
ファミリ | インストラクション | 動作概要 | 必要ワード数 | 実行 サイクル数 |
Wレジスタへの影響 | |
移動 | mov | fr,#imm | fr = imm | ○ | ||
mov | fr1,fr2 | fr1 = fr2 | ○ | |||
mov | fr,W | fr = W | ||||
mov | option,#imm | option = imm | ○ | |||
mov | option,fr | option = fr | ○ | |||
mov | option,W | option = W | ||||
mov | !port,#imm | tris(port) = imm | ○ | |||
mov | !port,fr | tris(port) = fr | ○ | |||
mov | !port,W | tris(port) = W | ||||
mov | W,#imm | W = imm | ○ | |||
mov | W,fr | W = fr | ○ | |||
mov | W,/fr | W = ~fr | ○ | |||
mov | W,fr-W | W = fr - W | ○ | |||
mov | W,++fr | W = ++fr | ○ | |||
mov | W,--fr | W = --fr | ○ | |||
mov | W,<<fr | W = (fr<<1) | ○ | |||
mov | W,>>fr | W = (fr>>1) | ○ | |||
mov | W,<>fr | W = ((fr<<4)&0xf) | ((fr>>4)&0xf) | ○ | |||
movb | bit1,bit2 | bit1 = bit2 | ||||
mov | bit2,/bit2 | bit2 = !bit2 | ||||
movsz | W,++fr | ○ | ||||
movsz | W,--fr | ○ | ||||
swap | fr | fr = ((fr<<4)&0xf) | ((fr>>4)&0xf) |
||||
クリア | clr | W | W = 0 | 1 | 1 | ○ |
clr | fr | fr = 0 | 1 | 1 | ||
clrb | bit | bit = 0 | ||||
加算 | add | fr,#imm | fr += imm | ○ | ||
add | fr,W | fr += W | ||||
add | fr1,fr2 | fr1 += fr2 | ○ | |||
add | W,fr | W +=fr | ○ | |||
add | W,#imm | W += imm | ○ | |||
addb | fr,bit | if(bit==1) fr++ | ||||
inc | fr | fr++ | ||||
incsz | fr | if((++fr&255)==0) skip | ||||
減算 | sub | fr,#imm | fr -= imm | ○ | ||
sub | fr,W | fr -= W | ||||
sub | fr1,fr2 | fr1 -= fr2 | ○ | |||
sub | W,fr | W -= fr | ○ | |||
sub | W,#imm | W -= imm | ○ | |||
subb | fr,bit | if(bit==1) fr-- | ||||
dec | fr | fr-- | ||||
decsz | fr | if(--fr==0) skip | ||||
条件分岐 | cja | fr,#imm,addr | if(fr>imm) goto addr | ○ | ||
cjbe | fr,#imm,addr | if(fr<=imm) goto addr | ○ | |||
cjae | fr,#imm,addr | if(fr>=imm) goto addr | ○ | |||
cjb | fr,#imm,addr | if(fr<imm) goto addr | ○ | |||
cje | fr,#imm,addr | if(fr==imm) goto addr | ○ | |||
cjne | fr,#imm,addr | if(fr!=imm) goto addr | ○ | |||
cja | fr1,fr2,addr | if(fr1>fr2) goto addr | ○ | |||
cjbe | fr1,fr2,addr | if(fr1<=fr2) goto addr | ○ | |||
cjae | fr1,fr2,addr | if(fr1>=fr2) goto addr | ○ | |||
cjb | fr1,fr2,addr | if(fr1<fr2) goto addr | ○ | |||
cje | fr1,fr2,addr | if(fr1==fr2) goto addr | ○ | |||
cjne | fr1,fr2,addr | if(fr1!=fr2) goto addr | ○ | |||
jb | bit,addr | |||||
jnb | bit,addr | |||||
jc | bit,addr | if(C==1) goto addr | ||||
jnc | bit,addr | if(C==0) goto addr | ||||
jz | bit,addr | if(Z==1) goto addr | ||||
jnz | bit,addr | if(Z==0) goto addr | ||||
条件スキップ | csa | fr,#imm | if(fr>imm) skip | ○ | ||
csae | fr,#imm | if(fr>=imm) skip | ○ | |||
csb | fr,#imm | if(fr<imm) skip | ○ | |||
csbe | fr,#imm | if(fr<=imm) skip | ○ | |||
cse | fr,#imm | if(fr==imm) skip | ○ | |||
csne | fr,#imm | if(fr!=imm) skip | ○ | |||
csa | fr1,fr2 | if(fr1>fr2) skip | ○ | |||
csae | fr1,fr2 | if(fr1>=fr2) skip | ○ | |||
csb | fr1,fr2 | if(fr1<fr2) skip | ○ | |||
csbe | fr1,fr2 | if(fr1<=fr2) skip | ○ | |||
cse | fr1,fr2 | if(fr1==fr2) skip | ○ | |||
csne | fr1,fr2 | if(fr1!=fr2) skip | ○ | |||
sb | bit | |||||
snb | bit | |||||
sc | bit | |||||
snc | bit | |||||
sz | bit | |||||
snz | bit | |||||
skip | skip | |||||
サブルーチン・ジャンプ | jmp | addr | goto addr | |||
jmp | pc+W | goto (pc+w) | ||||
jmp | W | goto W | ||||
lcall | addr | |||||
ljmp | addr | |||||
lset | addr | |||||
ret | ||||||
retw | list... | |||||
ループ制御 | djnz | fr,addr | if(--fr!=0) goto addr | |||
ijnz | fr,addr | if((++fr&255)!=0) goto addr | ||||
ビットセット・クリア | clc | |||||
stc | ||||||
clz | ||||||
stz | ||||||
setb | bit | |||||
シフト | rl | fr | fr = (fr<<1) | C | |||
rr | fr | fr = (fr>>1) | (C<<7) | ||||
その他 | nop | n | nop | |||
neg | fr | fr = -fr | ||||
not | fr | fr = ~fr | ||||
not | W | W = ~W | ○ | |||
test | fr |
ファミリ | インストラクションの大まかな分類を示す |
動作概要 | インストラクションの大まかな動作を示す |
Wレジスタへの影響 | 当該インストラクションの実行によってWレジスタの値が書き換わる場合は○ |
必要ワード数 | PAアセンブラでマイクロチップインストラクションに展開された場合の必要ワード数 |
実行サイクル数 | 当該インストラクションを実行した場合の実行サイクル |
◇Microchipインストラクションセット
インストラクション | 16C5x,12C5xx | 16Cxx,16Fxxx | |
addwf f,d | ○ | ○ | |
andwf f,d | ○ | ○ | |
clrf f | ○ | ○ | |
clrw | ○ | ○ | |
comf f,d | ○ | ○ | |
decf f,d | ○ | ○ | |
decfsz f,d | ○ | ○ | |
incf f,d | ○ | ○ | |
incfsz f,d | ○ | ○ | |
iorwf f,d | ○ | ○ | |
movf f,d | ○ | ○ | |
movwf f | ○ | ○ | |
nop | ○ | ○ | |
rlf f,d | ○ | ○ | |
rrf f,d | ○ | ○ | |
subwf f,d | ○ | ○ | |
swapf f,d | ○ | ○ | |
xorwf f,d | ○ | ○ | |
bcf f,d | ○ | ○ | |
bsf f,d | ○ | ○ | |
btfsc f,b | ○ | ○ | |
btfss f,b | ○ | ○ | |
addlw k | − | ○ | |
andlw k | ○ | ○ | |
call k | ○ | ○ | |
clrwdt | ○ | ○ | |
goto k | ○ | ○ | |
iorlw k | ○ | ○ | |
movlw k | ○ | ○ | |
retfie | − | ○ | |
retlw k | ○ | ○ | |
return | ○ | ○ | |
sleep | ○ | ○ | |
sublw k | − | ○ | |
xorlw k | ○ | ○ |
メールはこちらにお願いします。
pa3@mypaso.com