§7.PICプログラミングMANIACS2(PICプログラミングの高度なテクを満載)99/4/17
しまったな〜。
前回の記事を書いて、その週に発売されたトラ技(トランジスタ技術)が、PIC特集だった。しかも、内容、相当重複してるし、これから書こうと思っていたことも書かれてるし、自分でテキトーに書いてた部分も正確に書いてあるし、もー参ったなぁ(笑) しばらく、落ちこんでました(笑)
まあ、気をとりなおして、続きを書きます。どうも、PICでも主に使うのはミッドレンジで、そいつらはたいてい、16F84とコンパチなのですが、こいつら、演算機能とかが弱く、16ビット演算なんかすることになった日にゃあ...。
それなのに、そのへんを詳しく書いている記事が無い!少なくとも、インターネット上の日本語サイトには存在しないんではないでしょうか。そんなわけで、演算がらみを少しずつ紹介して行きたいと思います。
☆ 疑似16ビットレジスタのデクリメントについて
予め上位レジスタをデクリメントしておけば、
decf iL,f
decf iH,f
incfsz iL,w // iL==0xff?
incf iH,f
同じ5waitで、ジャンプ用のラベルが不要という指摘を賜りました。うーん。やるなぁ。
なら、こんなんどう?
// もしくは
movlw D'255'
addwf iL,f
btfcc status,c // 255を加算して(-1の意味)ノンキャリーなら、その前は0であった
decf iH,f //
と言うことだから、iHをデクリメントする
うーん。こんなプログラム組んでる奴は、変態かも知れない。(笑)
☆ 16ビットレジスタ加算
// ix+=iy
movf iyL,w
addwf ixL,f
movf iyH,w
btfsc status,c
addlw 1
addwf ixH,f
うーん。こういうのマクロ定義しとかないとやってらんないと言う話もある。
☆ 8ビットファイルレジスタの符号反転
// s -= s
clrw
subwf s,f
// しかし以下のようにすればwを破壊せずに済む
comf s,f ; s = ~s 1の補数
incf s,f ; 1の補数+1=2の補数=もとの数の符号が逆のもの
うーん。こういうのあまり知られてないのかな?
☆ 8ビットレジスタからwの減算
どうも、PICはsubが使いにくくて困ってしまいますが...
// s = s - w
subwf s,f // s = w - s
comf s,f // s = -s
incf s,f
要するに、subでw−sは作れるわけで、その符号を先ほどのテクで反転させることで、s=s−wを実現してるわけですね。
☆ 8ビットシフト
// s >>= 1
rrf s,f
bcf s,7
// s <<= 1
rlf s,f
bcf s,0
当たり前と言えば当たり前なんだけど、bcfで最上位をクリアしたりせにゃならんあたり、悲壮感が滲み出ている。(笑)
☆ 16ビット右シフト
// i >>= 1
rrf iH,f
rrf iL,f
bcf iH,7
// i <<= 1
rlf iL,f
rlf iH,f
bcf iL,0
なんかダサイような気が...
☆ ポインタ操作
前回言い忘れていましたが、FSRとINDRレジスタを利用して、ファイルレジスタの任意の場所のメモリを読み書きすることが可能です。
データシートにも載っていますが、こんなところ普通読み飛ばす(笑)もんで、知らない人も多いでしょう。
よって、配列等は、ファイルレジスタ上の空きにリニアに確保して、こいつを使ってアクセスすれば実現できます。constな配列(読み出し専用)であれば、前回に紹介した、retlwでテーブル化すれば、プログラムメモリに配置できるので、やねうらおの給料のごとき、少ないファイルレジスタを圧迫せずに済みます。(なんのこっちゃ)