SH7125 モニター改修などなど

・SH7125 関係、アーカイブにアセンブラソースが抜けていたので、再収集。
・SH7125 の Flash ROM 書き換え回数制限の問題で、RAM上でプログラムの動作確認を行う件、多少進展。

RAM 上にロードしたプログラムから、ROM 上の関数を呼ぶ場合に、ROM 上の実アドレスなどが必要なのだが、どのように解決するか、少し考えて、その仕組みを実装してみた。
リンク時に作成される「map」ファイルを sed(ストリームエディター)で加工して、シンボルとそれに対応するアドレスを取り出し、アセンブラソースコードを自動生成する。
※以前、会社勤めの時に HP の unix システムを使った事があるが・・、そこで sed の面白さと出会った、今まで随分お世話になっている、今でもそれは変わらず、テキストの加工、成形には重宝している、その為、ed や ex といった unix システムに標準であるラインエディターは今でも使えるし、emacs が使えない場合等に、使う事が多い。(逆に vi のキーバインドは知らないので使えない・・)

マップファイルには、アドレスとシンボルの対がリストされている。
0x00000000000025b0 sh7125_sci_getch

----- sed スクリプト start
/^$/d
/^ \./d
/0x/!d
/^ /!d
/[()]/d
/ _/d
/0x000000000/!d
s/0x000000000/0x0/
/vectors/d
/start/d
/main/d
/set_imask/d
/get_imask/d
s/^ *\(0x[0-9a-fA-F]*\) *\([a-zA-Z0-9_]*\)$/ .global _\2NNN_\2:NNN mov.w _\2_,r0NNN jmp @r0NNN nopNNN_\2_:NNN .word \1NNN/
/^ /d
s/NNN/\
/g
----- sed スクリプト end

↑の sed スクリプトで、以下のソースを生成。
※map ファイルで余分な行を除外してから成形して1行にまとめて、最後に改行を入れている。
※改行をマークする文字列として、「NNN」を使っているので、シンボルに「NNN」を含めると問題となる・・

.global _sh7125_sci_getch
_sh7125_sci_getch:
mov.w _sh7125_sci_getch_,r0
jmp @r0
nop
_sh7125_sci_getch_:
.word 0x000025b0

↑こんな感じに成形される~

ROM内の関数を呼ぶ場合には、このインターフェースクラスを通る事で、オーバーヘッドがあるが、まぁそれは利便性を考えると許容出来る範囲と思える。
RAM 上のプログラムでは、このアセンブラソースをアセンブルしてリンクする事で、そのままのシンボル名で呼び出せる。
※ROM 内関数のアドレスが32K(0x7fff)を超えたら、テーブルは32ビットで持つ必要があるので、このままでは不十分となる。
※関数にはRAM を使う必要もあるが、それは、0xffffbd00 から256バイトが使われている、自分のシステムで問題となるなら、リンカースクリプトを変更する必要がある。

このスクリプトなどソースコード一式は、ここに置いてある。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください