標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第523回]

●PIC18F命令の’a’パラメータ

前回、前々回でBSRで指定したメモリバンクをアクセスするときには、アセンブラ命令の末尾の’a’パラメータに’1’を指定する、という説明をいたしました。
たとえば
movwf UEP0,1
のように表記します。

もしここで’a’パラメータに’1’を指定しないで、PIC16Fでの普通の表記と同じように
movwf UEP0
のように表記すると、それはPIC18Fでは
movwf UEP0,0
と表記したのと同じことになります。

つまり’a’パラメータはデフォルトでは’0’ということのはずなのですが…。
PIC18F14K50のDataSheetを読んでみますと、それとは全く逆のことが書いてあります。


[出典]PIC18F14K50DataSheet

上はPIC18F14K50のDataSheetからの引用ですが、PIC18F2550/4550でも全く同じです。
ここでは movwf を取り上げましたが、メモリをアクセスする他の命令でも書いてあることは同じです。
こんなに堂々と書いてありますと、多分私の解釈が間違っているのだろうなあ、と思ってしまいます。

If ’a’ is ’1’,the BSR is used to select the GPR bank(default).

うーん。この default って、’a’を省略するとa=1になるよ、という意味ですよねえ。

この文章には、当初、ずいぶん悩まされました。
でも、今はもう無視してしまうことに決めました。

実際にアセンブラにかけてみると、’a’を省略した場合には、a=0になることを確認していますから。

論より証拠と申します。
何回かお見せしています、PIC18F14K50のUSBテストプログラムをアセンブルした結果(部分)で説明をいたします。

                      00024 ;
00000A                00025 usbreset
00000A 010F           00026         movlb 0f
00000C 0E16           00027         movlw 16
00000E 6F53           00028         movwf UEP0,1
000010 0E15           00029         movlw 15;ping-pong buffer set for EP0(out) only 
000012 6E61           00030         movwf UCFG
                      00031 ;
000014 EC1C F000      00032         call setbd0
                      00033 ;
000018 0EFF           00034         movlw 0ff
00001A 6E82           00035         movwf PORTC
00001C 0E48           00036         movlw 48
00001E 6E64           00037         movwf UCON;clear bit4,for SIE enbl
000020                00038 loop_ucon
000020 A864           00039         btfss UCON,4;if SETUP detect
000022 EF10 F000      00040         goto loop_ucon
                      00041 ;

movwf命令は何箇所かで使っています。
そのうち、’a’パラメータに’1’を指定しているのは、movwf UEP0,1 だけです。
マシン語に翻訳されたコードを見てみますと、6F53になっています。
さきほどのmovwf命令のDataSheetからの引用をみますと、
マシン語のコードは

0110111a ffffffff

と書いてあります。
UEP0のアドレスはF53で、その下位8ビットがそのまま命令の下位8ビットになっています。
上位バイトのビット0が’a’パラメータです。
ここに’1’を指定しましたから、命令コードは6Fになります。

ところで、そのほかのmovwf命令はどうなっているでしょうか。
movwf UCFG
movwf PORTC
movwf UCON
のいずれも、’a’パラメータを省略しています。
PIC16Fでの表記法のままです。

では、マシン語に翻訳されたコードはどうなっているでしょうか。
いずれも上位バイトは6Eです。
つまりこの結果からは、’a’パラメータを省略すると、a=0を指定したとみなされる、ということがわかると思います。

そうですよねえ。
これが逆だったら、面倒でたまりません。
まあ、このプログラム例では、
movwf UEP0以外は
movwf UCFG,1
movwf PORTC,1
movwf UCON,1
でも
movwf UCFG,0
movwf PORTC,0
movwf UCON,0
でも、どちらでもよいのですけれど。

BSRに0Fを入れていますから、そういうことでよいのですけれど、別のバンクをアクセスするために、BSRに0F以外の値をセットすると、システム用のワークレジスタ(SFR)をアクセスするためには、いちいち命令の末尾に’0’をつけなくてはならなくなってしまいます。そりゃあ大変なことです。
そう考えますと、’a’パラメータを省略すると、a=0が指定されたことになる、っていうのは、まことに有り難いことです。

でも、そうすると、あの default って、一体何なのでしょうか。
うむむ。
謎ですなあ。
2010.6.13upload

前へ
次へ
ホームページトップへ戻る