標準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
前へ
次へ
ホームページトップへ戻る