命令アドレスの単位

SHやH8, Z80等のプリンストンアーキテクチャに慣れきった頭で、PICのハーバード・アーキテクチャを考えてしまい無駄な時間をつぶしてしまった。
HEXファイル出力からConfiguration Wordの値を確認しようとしたら、該当データのアドレスが違う。ソースコードやヘッダファイル、果てはリンカ・スクリプトまでチェックしたが原因不明。朝まで考えてようやく気が付いた。
命令バスはデータ・バスと別だから、アドレス単位がバイトじゃなかった。
Configuration Wordはプログラム・メモリにあるからワード単位。一方、HEXファイルの方はバイト・データで格納されているから、HEXファイルのアドレスを2で割る必要がある。
PIC24FJ64GA002のHEXファイルに


:020000040001f9
:0457f8000ff90000a5
とあるなら、アドレスは0x000157f8となる。2で割ると0xABFCで、Configuration Word2のアドレスと一致する。

ハーバード・アーキテクチャにまだ慣れないので、似たような間違いを繰り返しそうで怖い。

しかし、何でPIC24は、命令をワード(16bit)でアドレスするんだろう?
CPUが16bitなのはデータの話で、命令は24bit+ファントム8bit=32bitなんだから、ロングワード(4byte)単位でアドレスするならまだ判るんだけど。
たぶんプログラム・メモリをテーブルとしてデータ・バスからアクセスする関係なんだろうけど、それはテーブルへバイト・アクセス可能なのと同様、どうにでもなりそうな気がする。きっと開発エンジニアの考え方が私と違ったんだろう。