田舎の組み込みプログラマーがわざわざ趣味でも色々開発してみようとあがく様を綴るブログです。
DMM.makeのクリエイターズマーケットに出品しています。
2000h問題、部分的に解決 ― 2015年09月08日
2000h問題とは
寡聞にして知らなかったのですが、R8Cでは絶対ビット命令アドレッシングで使用できるメモリの上限は1FFFhまでとなっています。
R8CのCAN関連レジスタは2E00h以降に割り付けられており、この制限に引っかかっていることに遅ればせながら気付いて先日つまづいてしまったわけです。
そこで
部分的にですが、以下のような処方で解決を図ってみました。
ちなみに、言語は構造化アセンブラです。
; 定義部
slpm_c0ctlr .define 2,c0ctlr
MEM$_BIT_RESET .macro iBitNum, iBaseMem
.if iBaseMem < 2000h
bclr iBitNum, iBaseMem
.else
A0 = iBitNum
bclr iBaseMem[A0]
.endif
.endm
; 実体記述部
MEM$_BIT_RESET slpm_c0ctlr
; 展開結果
MEM$_BIT_RESET 2,c0ctlr
.if iBaseMem < 2000h
.else
A0 = 2
MOV.W #2,A0
bclr c0ctlr[A0]
.endif
ざっくり言うと、2000h以降のビット操作命令に関しては自動的にアドレスレジスタ相対アドレッシングにしてしまうと言うわけです。
定義部の".define"ではビット情報を文字列として定義しています。
ビット定義には".btequ"という専用の疑似命令があるんですが、これはアセンブル時にアドレスの決まっているメモリにしか使用できず、実質的にはSFR領域にしか使用できません。
そこで、単なる文字列として定義しておけばリロケータブル領域の変数に対してもビット定義をしている体を為すことができるのです。
構造化アセンブラについて語り出すと長くなるのでこの辺で。
コメント
トラックバック
このエントリのトラックバックURL: http://trident.asablo.jp/blog/2015/09/08/7782917/tb

コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。