« 湯沢遠征 | トップページ | へびつかい~さそりモザイク »

2014年5月30日 (金)

「天文屋のためのマイコン入門」バンクのもう一つの解釈

前回、バンクという概念をページという概念に置き換えて説明しました。その様子を図に表しました。

たとえば、1ページ目の31番地をアクセスする場合で説明します。

1 STATUSレジスタは(RP1,RP0)=(0 , 1)なので、1ページ目が抜き出される。
2 MOVWF 31 は1ページ目の番地31にアクセスされる。

1405291

さて、バンクを理解するもう一つの方法を説明します。結果はどちらも同じですが。

512個のレジスタファイルを4つのバンク(ページ)に分けるのではなく、縦に4つ並べ、通しの番地を割り当てます。(これを絶対番地という)

1405292_2 

こうすると、たとえば1ページ目の31番地は158番地になります。こうすれば番地の重複はありません。でも番地の最大値の制約127を超えてしまいます。もしプログラムで、

MOVWF  158

と書いたらどうなるでしょうか? 不思議なことにこれはエラーなりません。ちゃんと158番地にアクセスされるでしょうか? もちろんNOです。これが通るなら最初から苦労はしません。命令のフォーマットにおいて番地を指定するのは7ビットでした、したがって、127までしか許されません。

これは127を超えたら、128で割ったあまりと実質的に同じなります。

したがって、

MOVWF  158

は、

MOVWF  31

とまったく同じです。

したがって、STATUSレジスタがページ1を示していない限りページ1にはアクセスされません。ではなぜ、通し番地を使用するのでしょうか?

実際、PICマイコンのマニュアルを見ると、レジスタの番地は通し番地で書かれています。

こう考えてください。

1 レジスタはすべて通し番地の番地を持っている。重複は一切ない。
2 そうすると、512個のレジスタの番地を示すには9ビットが必要(2の9乗=512)
3 ただし、命令コストの制約があるので、9ビットの下位7ビットしか命令中に含められない。
4 余った2ビットはSTATUSレジスタの(RP1,RP0)に格納するとする

これを図で表したものがこれです。

1405293_2

この決まりをマイコンの立場にたって考えてみます。

1 マイコンがMOVFW 31の命令に遭遇したら、この命令からレジスタの番地31を抜き出します。(2進数で0011110)

2 ただ、これはあくまでも9ビットの番地の下位7ビットに過ぎません。したがって、マイコンはSTATUSレジスタから上位2ビット(0,1)を上位に足して、真の番地158番地を得ます。

3 よってマイコンが158番地のレジスタにアクセスします。

1405301

これがバンクの通し番地(絶対番地)による解釈です。

マイコンの物理的な動作としてはこちらのほうが真に近いと思います。なぜなら、

●マニュアルでは通し番地で記述されている
●プログラムに通し番地を記述してもエラーにならない

ただ、どちらの解釈であっても結果は同じ(プログラムは同じ)ですから、どちらで理解してもかまいません。

|

« 湯沢遠征 | トップページ | へびつかい~さそりモザイク »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 湯沢遠征 | トップページ | へびつかい~さそりモザイク »