# ルネサスRL78の逆アセンブル実践ガイド｜仕様書なし旧基板を復元した事例｜テクノスフィア

> ルネサスRL78マイコンの逆アセンブル手順を実機ベースで解説。仕様書もソースコードもない15年前の産業用機器を、elfファイルからC言語に復元した実践事例。レジスタ解析・最新マイコン移植まで公開。

URL: https://technosphere.co.jp/blog/renesas-rl78-reverse-engineering

## 背景：仕様書もソースコードもない状態からの再開発

 製造業のお客様から「15年前に開発した産業用計測機器の制御基板を再生産したいが、仕様書もソースコードも紛失してしまった。残っているのは実機と、コンパイル済みのelfファイルのみ」というご相談をいただきました。

 対象のマイコンは**ルネサス RL78/G13**。当時のメーカー担当者は既に退職しており、開発環境も失われている状態でした。部品の生産終了も迫っており、最新のマイコン（[STM32F4シリーズ](https://technosphere.co.jp/blog/stm32-uart-i2c-can)）への移植も同時に求められました。

###  本記事の対象読者
- 仕様書なしのレガシーシステム再開発を検討している方
- バイナリ解析・逆アセンブル技術に興味がある組込みエンジニア
- 古いマイコンから最新マイコンへの移植を計画している方

## 払拭すべき3つの課題

このプロジェクトを進めるにあたり、以下の課題を整理しました。

### 1. アルゴリズムの特定とデータテーブルの存在

 計測機器の核心である「制御ロジック」が、プログラム上の計算によるものか、あるいはROM/EEPROMに格納された独自のデータテーブルによるものかを特定する必要がありました。

 elfファイル内にデータテーブルが不完全な場合、実機からのメモリダンプが必要になります。

### 2. ハードウェア依存のタイミング調整

 15年前のマイコン特有の処理待ち（ディレイループ）が、現在の高速なマイコンでは再現できないリスクがあります。

 計測機器としての「正確なパルス幅・サンプリング周期」を担保するため、実機の出力波形をオシロスコープで実測し、復元コードとのベンチマークを行う工程が不可欠でした。

### 3. 周辺回路仕様の把握

 GPIOポートの先にあるアナログ回路（増幅器・フィルター等）の特性はバイナリからは読み取れません。

 基板上の回路構成を実機から解析し、レジスタ設定値との整合性を確認する作業が必要でした。

## 逆アセンブルの実践手順

以下の手順でelfファイルからC言語への復元を進めました。

### ステップ1：elfファイルの解析

```
# RL78用objdumpでディスアセンブル
rl78-elf-objdump -d firmware.elf > disasm.txt

# シンボルテーブルを抽出
rl78-elf-nm firmware.elf > symbols.txt

# セクション情報を確認
rl78-elf-readelf -S firmware.elf

```

 RL78のアーキテクチャ固有のレジスタ名（P0, ADM, TDRなど）を手がかりに、ペリフェラル設定箇所を特定しました。

### ステップ2：フローチャートの作成

 ディスアセンブル結果から、以下の構造を読み取りました：
- **初期化ルーチン**：クロック設定、GPIO設定、ADC設定
- **メインループ**：センサーデータ取得 → 演算処理 → 出力制御
- **タイマー割り込みハンドラ**：10ms周期でのサンプリング制御
- **UART通信ハンドラ**：外部PCとのデータ送受信

###  ポイント：レジスタ操作の解読

 RL78のレジスタは8ビット単位で直接操作されており、以下のようなアセンブラ命令が頻出しました。

```
; P0レジスタ（ポート0）のビット3をセット
SET1 P0.3

; ADMレジスタ（AD変換モード）に0x80を書き込み
MOV ADM, #80h

```

 これらをルネサスのハードウェアマニュアルと照合し、C言語のビット操作マクロに変換しました。

### ステップ3：C言語への復元

解析結果をもとに、以下のようなC言語コードを復元しました。

```
// RL78/G13 ADC初期化（復元コード）
void ADC_Init(void) {
    ADCEN = 1;           // ADコンバータ有効化
    ADM0  = 0x00;        // ソフトウェアトリガモード
    ADM1  = 0x20;        // 10ビット分解能
    ADM2  = 0x00;        // Vref = VDD
    ADCE  = 1;           // 比較器有効化
}

// タイマー割り込みハンドラ（10ms周期）
__attribute__((interrupt))
void INTTM00(void) {
    static uint16_t adc_value;

    // ADC開始（ADCS=1で変換開始。ADCSは「変換中=1」を示すビット）
    ADCS = 1;
    while(ADCS);         // 変換中フラグが下がる（=完了）まで待つ
    adc_value = ADCR;    // 結果読み取り
    // ※本来は変換完了割り込み(INTAD)で受けるのが定石。ここでは簡易にポーリング

    // データ処理（省略）
    process_sensor_data(adc_value);
}

```

### ステップ4：実機波形との突合

 復元したコードをRL78評価ボードで動作させ、以下の検証を行いました：
- オシロスコープで実機とのGPIO出力波形を比較
- ADC値のサンプリングタイミングを実測
- UART通信のボーレートとデータフォーマットを確認

 この工程で、タイマー設定値の微調整や、ディレイループの補正を実施しました。

## STM32への移植

 復元したC言語コードを、最新のSTM32F4マイコンに移植しました。

### 移植のポイント
|  項目 |  RL78/G13 |  STM32F4 |
|  クロック周波数 |  32MHz |  168MHz（5倍高速） |
|  ADC分解能 |  10ビット |  12ビット |
|  タイマー |  16ビットタイマアレイユニット（TAU） |  16/32ビット高精度タイマー |
|  開発環境 |  CS+ (ルネサス) |  STM32CubeIDE + HAL |

 クロック周波数が5倍になったため、ディレイループを以下のように調整しました。

```
// RL78版（32MHz想定）
void delay_us(uint16_t us) {
    for(uint16_t i = 0; i < us * 8; i++) {
        __nop();
    }
}

// STM32版（168MHz想定）
// ※STM32 HAL標準にus単位の遅延関数は無い（HAL_Delay()はms単位）。
//   DWTサイクルカウンタやタイマで自作したus遅延を使う。
void delay_us(uint16_t us) {
    uint32_t start = DWT->CYCCNT;
    uint32_t ticks = us * (SystemCoreClock / 1000000U);
    while ((DWT->CYCCNT - start) < ticks) { __NOP(); }
}

```

## 成果：完全な動作再現に成功

プロジェクトは以下の成果を得ました：
- **elfファイルから完全なC言語復元**：約2,000行のコードを復元
- **実機との波形一致率99%以上**：オシロスコープでの検証
- **STM32への移植完了**：開発期間3ヶ月（通常の新規開発の半分）
- **暫定仕様書の作成**：今後のメンテナンス用ドキュメント整備

###  お客様の声

>  「諦めていた製品の再生産が実現できました。復元された仕様書により、今後の改良も可能になりました。テクノスフィアさんの逆アセンブル技術は驚異的です。」
 — 製造業A社 開発部長

## まとめ：レガシーシステムの逆アセンブルで押さえるべきポイント

本プロジェクトを通じて得られた知見をまとめます。

### 技術的なポイント
- **ハードウェアマニュアルの徹底活用**：レジスタ操作の意味を正確に把握
- **実機検証の重要性**：波形測定によるタイミング検証は必須
- **段階的な復元**：初期化→メインループ→割り込みの順で解析
- **ツールの選定**：objdump, IDA Pro, Ghidraなど複数ツールを併用

### プロジェクト管理のポイント
- **初期調査フェーズの確保**：実現可能性を見極める期間が重要
- **実機の確保**：動作する実機があれば成功率が飛躍的に向上
- **段階的なマイルストーン設定**：解析→復元→検証→移植の各フェーズで区切る

## テクノスフィアの逆アセンブル・レガシーシステム再構築サービス

 弊社では、仕様書やソースコードがない古い組込み機器の再開発に対応しています。
- **対応マイコン**：Z80, 8051, AVR, ARM, ルネサス, TI, 日立系MCU
- **対応ファイル形式**：elf, hex, bin, s19など
- **実績アーキテクチャ**：8ビット〜32ビット幅広く対応

 「古い機器を現代に蘇らせたい」「部品廃止で困っている」といったご相談は、[お問い合わせフォーム](https://technosphere.co.jp/contact)からお気軽にご連絡ください。     ／この内容の受託開発・PoC相談はこちら＼

### レガシー組込み機器の逆アセンブル・再構築

RL78 / Z80 / 8051 / 旧ルネサス系の制御基板を、ソースコードが無い状態から復元・再開発します。部品廃止対応・基板リプレース・最新マイコンへのポーティングまで、テクノスフィアにお任せください。  [組込み開発サービスを見る](https://technosphere.co.jp/embedded) [EOL移行・逆アセン相談](https://technosphere.co.jp/contact)

##  関連記事

### [組込システム ルネサスマイコン開発ガイド 総目次](https://technosphere.co.jp/blog/renesas-mcu-guide)

### [組込システム STM32マイコンのUART・I2C・SPI・CAN通信 実装ガイド](https://technosphere.co.jp/blog/stm32-uart-i2c-can)

### [組込システム Raspberry PiでセンサーIoT：温湿度データをクラウド送信](https://technosphere.co.jp/blog/raspberry-pi-sensor-iot)

### [サービス 組込み制御・マイコン開発サービス](https://technosphere.co.jp/embedded)

### 組込み開発のご相談

 レガシーシステムの再構築から最新マイコンの開発まで、お気軽にご相談ください。  [お問い合わせ](https://technosphere.co.jp/contact)

### カテゴリ
- [組込システム](https://technosphere.co.jp/blog/?cat=組込システム)
- [AI・機械学習](https://technosphere.co.jp/blog/?cat=AI・機械学習)
- [クラウド](https://technosphere.co.jp/blog/?cat=クラウド)

### タグ  [逆アセンブル](https://technosphere.co.jp/blog/?tag=%E9%80%86%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AB) [ルネサス RL78](https://technosphere.co.jp/blog/?tag=%E3%83%AB%E3%83%8D%E3%82%B5%E3%82%B9+RL78) [レガシーシステム](https://technosphere.co.jp/blog/?tag=%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0) [マイコン移植](https://technosphere.co.jp/blog/?tag=%E3%83%9E%E3%82%A4%E3%82%B3%E3%83%B3%E7%A7%BB%E6%A4%8D) [リバースエンジニアリング](https://technosphere.co.jp/blog/?tag=%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0) [組込み再開発](https://technosphere.co.jp/blog/?tag=%E7%B5%84%E8%BE%BC%E3%81%BF%E5%86%8D%E9%96%8B%E7%99%BA)
