RL78を再開

以前に、gcc では、内部データフラッシュメモリーへのアクセスがサポートされない
事で、開発をストールさせていたが、GR-Cotton でRL78/G13が使われており
WEBコンパイラは gcc となっている、また、データEEPROMのアクセスライブ
ラリーもあるようなので、これらを利用する事にした。
※以前に、ルネサスのIDEでは、RL78はC++をサポートしないので、gcc 用
ライブラリの提供をお願いした際「できません」と断られた事があった。

GR-Cotton では WEB コンパイラで gcc を使っていて、gcc 用ライブラリーを同梱し
ている。
それなら、それを教えてくれてもいいと思うのだが・・・

今回、仕事でRL78のオファーを受けた事で、データ・フラッシュは必須なので、
検討を始めた。
以前に、データフラッシュライブラリのオブジェクト(CS+IDE)をダンプした
ら、リバースエンジニアできそうな感じだったのだが、gcc 判があれば話が早い。

早速、GR-Cotton のプロジェクトを作成して、ソースコード一式を入手した。

その中にデータEEPROM操作関係のAPIがあるので、関係する部分を取得して、
自分のシステムに組み込んでみた。
※肝心な部分は、やはり、ライブラリーになっており隠蔽されている。(pfdl.a)

「pfdl.a」は、2つのオブジェクトをアーカイブしたものであるようだ。

% rl78-elf-nm pfdl.a

pfdl.o:
0000009d R _PFDL_Close
00000025 R _PFDL_Execute
00000091 R _PFDL_Handler
00000000 R _PFDL_Open
0000009d R PFDL_Close
00000025 R PFDL_Execute
0000006b r PFDL_Execute_erase
0000008a r PFDL_Execute_exit
00000061 r PFDL_Execute_firmware
0000007c r PFDL_Execute_read
0000007f r PFDL_Execute_read_next
00000091 R PFDL_Handler
00000000 R PFDL_Open

pfdl_version.o:
00000000 R _PFDL_GetVersionString
00000009 R _PFDL_VERSION_STRING
00000000 R PFDL_GetVersionString

ライブラリから、オブジェクトを分解して、肝心なオブジェクトを逆アセンブルして
みた。

rl78-elf-ar x pfdl.a
rl78-elf-objdump -D pfdl.o > pfdl.lst
00000000 :
   0:   c1                              push    ax
   1:   c3                              push    bc
   2:   a8 08                           movw    ax, [sp+8]
   4:   71 00 90 00                     set1    !f0090 .0
   8:   c7                              push    hl
   9:   16                              movw    hl, ax
   a:   bf 04 08                        movw    !f0804 , ax
   d:   8c 01                           mov a, [hl+1]
   f:   9f 01 08                        mov !f0801 , a
  12:   e5 03 08                        oneb    !f0803 
  15:   f2                              clrb    c
  16:   fc f8 ff 0e                     call    !!efff8 
  1a:   c6                              pop hl
  1b:   cf 80 08 04                     mov !f0880 , #4
  1f:   62                              mov a, c
  20:   9d f0                           mov 0xffef0, a
  22:   c2                              pop bc
  23:   c0                              pop ax
  24:   d7                              ret

上記は、PFDL_Open API の逆アセンブルソースだが、妙なアドレスをアクセスしている。
「F0804、F0801、F0803、F0880」これは、データフラッシュ関係の
制御レジスターと思われる。(ハードウェアーマニュアルには記載は無い)
また、「EFFF8」をコールしている、この部分に、データEEPROMのファーム
があるものと思われる。(このファームの存在も、一切記述が無い)

※改めて思うが、何故、隠蔽して、情報をオープンにしないのか、全く理解に苦しむ。
※本当に知りたいのなら、リバースエンジニアリングできるし、制限を設ける理由も思
いつかない。(ユーザーは不便になり、メーカーはサポートする仕事が増えるだけ)

早速テスト・・・
PFDL_Open関数を呼び出すと、戻ってこない・・・
PFDLライブラリのドキュメントを調べると、暗黙的に利用するワークRAMがあるよ
うだ。(セルフRAM領域)
※不思議な事に、デバイスにより、必要な場合と不必要な場合がある。
しかし、自分が使っているRL78/G13(R5F100LG)では、セルフRAMは
必要無い。
また、これとは別に、デバイス共通で、RAMの最終アドレス付近は、(0xFFE20
~後ろ)はライブラリの利用領域として予約されている。
※スタックやデータバッファと記述がある。

自分は、スタックを共有する為、RAMの最終アドレスを設定している。

色々、悩んだ末、解決した。
どうやら、ライブラリ内では、スタックを再設定して、内部処理を行い、ライブラリを出
る時に元に戻しているようだ。
この動作の為、共有していると正常に動作しないようだ、アプリ側のスタックを完全に分
離して、オーバーラップしないようにしたら、あっけなく動作した・・・
※これだからブラックボックスは嫌いだ・・・(まぁ自分の思い込みが原因ではあるけど)

以前にRXマイコンで作成した、対話形式で、データフラッシュの操作を行うプログラム
を組み込んで、実際に操作してみた。

問題なく書き込める!

とりあえず、操作できるようだ、これで、RL78も他のマイコンと遜色無く使える事が
判ったので、色々利用してみたい。
RL78はコストが安いので、R8C/M120とRXの中間を埋める「駒」として重宝
しそうだー

RL78データフラッシュサンプル