超ローコストPICWRITERの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
「PICBASICコンパイラ」からスピンオフ!!
過去記事を参照することなどを考えて該当する過去記事は「PICBASICコンパイラ」のまま連載回もそのままとします。
以後は前回記事からの流れで[第236回]からとします。
「PICBASICコンパイラ」はなるべく早く連載を再開したいと考えています。
PICはローコスト、高機能で種類も豊富なお手軽マイコンですがプログラムを書き込むためのWRITERが必要です。
それをできるだけ安価に作ってしまおうというプロジェクトです。
最終的には製品化を考えています(組立キット、完成品)。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第322回]
●PIC18アセンブラ
このところPIC16アセンブラについて書いてきました。
まだ不十分なところはありますがまずまず使えるバージョンができたと思います。
過去記事を整理してみますとPICWRITERの最初のスタートはPIC18からでした。
しかしPIC18よりもPIC16やPIC12のほうがより扱い易いということもあって途中からPIC16を対象にしてPICWRITERプログラムを作ってきました。
ところが新しいPIC16のなかにはMPLABではアセンブルできないものが出てきました。
MPLAB Xならできるということのようですがとてもじゃないけど扱いにくくて使う気になりません。
ならばどうするということでMPLABでできないのならばいっそのことPICアセンブラを作ってしまおうじゃないかというのでやり始めたのがこのところの作業でした。
それが一段落したならば次はPIC18アセンブラも作ってしまおうというのが当然の流れでありましょう。
そもそも当PICWRITERの製作はPICBASICコンパイラを作っている途中で派生したのでした。
コンパイラのオーソドックスな作り方としてまずはコンパイラの命令をアセンブラプログラムに翻訳するというのがごく普通の作法です。
その後にそのアセンブラプログラムをマシン語に変換します。
そういうことなのでPICBASICコンパイラを作る過程でまずはPICアセンブラを作ることから始めたのでした。
PICBASICコンパイラはPIC18Fをターゲットに考えていましたからその作成過程で作ったのはPIC18アセンブラでした。
もっともそれはあくまでコンパイラの中に組み込む形で作成したものなのでアセンブラとして単独で動作するものではありません。
アセンブラとして独立して使えるようにするにはBASICコンパイラに組み込む形で作ってきたアセンブラをもとにして加工しなければなりません。
たまたま流れとして途中からはPIC16用のPICWRITERを作ってきていたこともあって独立したアセンブラとしてはまずはPIC16アセンブラを作ることになりました。
そういうことでしたから実のところPIC18アセンブラもおおまかなところはすでにできていました。
そこでこの数日間は先にできたPIC16アセンブラをもとにしてそれをPIC18アセンブラに作り変える作業をしていました。
なんだか手戻りのようですけれど結果としてそういう作業になってしまいました。
ともかく先にPIC16アセンブラを作ってからPIC18アセンブラを作る流れになったためにPICBASICコンパイラを作る過程では気が付かなかった両者の違いにあらためて気が付きました。
以下はいつものように私自身の備忘録として書くことになりますので多くの読者様にはどーでもよいことかも知れません。
しかしPICアセンブラプログラムを実際に書いてみようとお考えの方には有益な情報もあるかと思います。
退屈しない程度にお付き合いください。
本題に戻ります。
両者の違いというのは何というかいかにもMicrochip的な違いではあります。
下はPIC16F1827のテストプログラムをMPLABでアセンブルしてできたリストファイルの一部です。
余計なメッセージがあちこちに入っていてちょっと読み難いですけれどポイントはそこではありません。
下は同じようにPIC18F2450のテストプログラムをMPLABでアセンブルしてできたリストファイルの一部です。
PIC16(およびPIC12)もPIC18も命令の構造は16ビットです。
厳密に言えばPIC16、PIC12の命令長は12ビットですが1ワード(16ビット)として扱われています。
8080やZ80にも2バイトの命令がありますが多くは1バイト8ビットの命令なのでPC(プログラムカウンタ)は1バイト単位で進みます。
これに対してPIC16、PIC12、PIC18には8ビットの命令はありません。
命令は1ワード(16ビット)なのでPCは1ワード単位で進みます。
なので先にお見せしたPIC16F1827のアセンブルリストはワード(16ビット、2バイト)単位になっています。
各行の先頭にアドレスが置かれていてその次にマシン語の命令コードが書かれています。
マシン語コードは1ワード(2バイト)になっていますからアドレスも000E、000F、0010、0011というようにワード単位になっています。
しかしこれをPICWRITERを使ってターゲットに焼く場合にはこのマシン語コードをHEXファイルに落としてそれを読み込みます。
HEXファイルはバイト単位ですからHEXファイルを解析するときには上記のことを意識する必要はありますがアセンブラとして考えるとソースプログラムとアセンブルリストの整合性は取れていて何の問題もありません。
ところがPIC16、PIC12の上位にあるはずのPIC18になるとここが根本的に変わってしまいます。
まさにMicrochipのあるあるです。
PIC16アセンブラとPIC18アセンブラを開発した組織は全く別なのかと思われるほどです(実際そうなのかも知れません)。
PIC18の命令長は完全な16ビットです。
さらに一部の命令は32ビットになっています。
もっともその命令も扱いとしては32ビットではなくて2ワードとして扱われています。
勿論PCもワード単位で進みます。
そういうことからするとPIC18アセンブラのアドレスも当然ワード単位のはずなのですが。
PIC18F2450のアセンブルリストをよくよく見てみますと。
アドレスの表記はぬあんとしっかりバイト単位になっています。
おいおい。
マイクロチップさんよ。
こうすることに何の意味があるの?
まあしかし。
これだけなら実害はありませぬ。
問題はORGとBZなどの命令において発生します。
いやあ。
こんなことは意識してなかったなあ。
大丈夫か。
Microchipよ。
下はPIC16F1827のアセンブルリストの先頭部分です。
org 0にgoto startがあります。
マシン語コードは2805です。
アドレス005へのジャンプ命令です。
org 5にstartがあってそのアドレスは0005です。
ごくフツーに理解できます。
ここのアドレスは上に書きましたようにワード単位なのでアドレス0005に2バイトのコード0023があっても次のアドレスは0006です。
まあフツーに納得です。
これがPIC18になりますと。
下はPIC18F45K50のアセンブルリストの先頭部分です。
org 00にgoto startがあります。
マシン語コードはEF0C F000です。
goto命令は2ワード32ビットに拡張されています。
そこからジャンプ先アドレスを抽出すると000Cになります(詳細は省きます)。
アドレス000Cへのジャンプ命令です。
ところがstartはorg 18で定義した0018にあります。
あれ?
おかしくね?
上のほうに書きましたようにワードマシンのはずなのにアセンブラの記載はバイト単位?
ところがところがマシン語コードのアドレス部分はワード単位?????
000Cをバイトに直すために2倍してみると確かに0018になります!
じゃあ。
じゃあ。
orgの指定は?
org 18つうのはバイト単位なのですよね。
ここはPIC16ならorg 00Cにするところですよお。
絶対におかしいよ。アンタ。
全く統一が取れていませんです。
こーいうところがいかにもMICROCHIPなのですよねえ。
もう疲れてしまいましたので今回はここまでにします。
次回に続きます。
超ローコストPICWRITERの製作[第322回]
2025.8.19 upload
前へ
次へ
ホームページトップへ戻る