今さらなぜCPUエミュレータを自作しようとおもったのか？

# 概要
これまで２回にわたって [athrill(アスリル)](https://qiita.com/kanetugu2018/items/1f2ef93c9e1fa7a29f97) の紹介記事を書いてきました．athrill は PC上で手軽に組込み系プログラムをデバッグできるようにするための CPU エミュレータです．

ここで一息，なぜ athrill を作る必要があったのか，そのいきさつを書いておきます．
※組込み系の開発で実機レス開発環境がないと同じようなトラブルに見舞われると思われますので，
※ここに書かれている内容は無意味ではないと信じております．

# きっかけ
数年前の暑い夏，とあるプロジェクトで[TOPPERS OS](https://www.toppers.jp/) を V850 に移植するお仕事をいただきました(先行試作開発)．ただ，移植に必要な開発環境の調達がなかなかできず，最悪，デバッガなしでの開発になる可能性が高まっていました．

このまま開発環境が調達できないとどうなるか，その当時脳内シミュレーションした結果を以下にまとめておきます．

* 外部入出力(デジタル入出力等)だけで OS のデバッグはきっと無理！
* 多重割り込み系のテストも多分無理
* 実機は１台しかないので，万が一壊したら開発が止まる…
* OS 上で動作するデバイスドライバやミドルの結合検査を複数人で実施できない(空き稼働のリスク)

さらに，その当時，実機動作確認できる場所が屋外しかなかったため，真夏日に外でテストし続けると倒れそう...

# 必死で調べました
そんな不安があったため，V850 の開発環境を必死で調べました．

* 前提
 * V850 CPU命令エミュレーション可能
 * 周辺デバイスのエミュレーションは必須(割り込みコントローラ含む)
 * 開発環境にかけることができる予算は<font color="Red">数十万円以内！</font>
* 既製品
 * 開発スケールさせようと思うと，予算にはまらない．
* オープンソース
 * 規模が大きすぎて無理(ソース理解している間に開発終わりそう…)
  * QEMU/SkyEye 等ありましたが，V850 は未サポート

# 最低，何があれば良いか？
OS 移植とは言っても，TOPPERS OS の場合は，すべてアセンブラで記述する必要はありません．C言語で書かれたところは x86 でビルド＆デバッグは可能です．なので，最低，以下をデバッグできる環境があれば良いことに気づきました．

* スタートアップルーチン
* 割り込み/例外処理
* タスクディスパッチ処理

これらを PC 上で動作確認するための何かを自作すれば良いのだと思えました．

#はじめの一歩はスタートアップルーチン
これらの中で，一番取り組みやすいのは，なんと言ってもスタートアップルーチンです(下図)．

```
	.section .text
	.align  4
	.global __start
__start:
	di                                  /* 割り込み禁止 */

	/*
	 * 各種ポインタの初期化(SP/TP/EP/GP/CTBP)
	 */
	GET_CID r4
	shl     2, r4
	Lea     _ostkpt_table, r3
	add     r3, r4
　　　　　：
```
必要な命令数もそれほど多くないですし，命令の内容もそんなに複雑ではない．
なので，それらのアセンブラ命令をデコードして，疑似的な CPU レジスタに値入れて，動作確認するだけでも全然違うだろうと思えました．

要するに，簡単なパーサーを作るようなものだと思えてきました．実機投入前にそれを使用して動作確認できれば，実機トラブルは激減するに違いない．こういうストーリーがぼくの中で出来上がりました．過去の偉人たちも [自作CPU](https://www.amazon.co.jp/CPU%E3%81%AE%E5%89%B5%E3%82%8A%E3%81%8B%E3%81%9F-%E6%B8%A1%E6%B3%A2-%E9%83%81/dp/4839909865/ref=pd_lpo_sbs_14_img_0/355-6444584-5963124?_encoding=UTF8&psc=1&refRID=J54H94PS157B1B66H4YN) や [自作エミュレータ](https://www.amazon.co.jp/%E8%87%AA%E4%BD%9C%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A7%E5%AD%A6%E3%81%B6x86%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3-%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%8C%E5%8B%95%E3%81%8F%E4%BB%95%E7%B5%84%E3%81%BF%E3%82%92%E5%BE%B9%E5%BA%95%E7%90%86%E8%A7%A3-%E5%86%85%E7%94%B0%E5%85%AC%E5%A4%AA/dp/4839954747) を作ったわけだし，『いっちょやってみるか！』というモチベーションに切り替わっていったわけです．

そして，運良く，V850 はマニュアルがしっかりしており，機械語のデコード仕様が明確になっていました．あとは，その仕様をソフトウェアで実現するだけというわけです．

# athrill(アスリル) 誕生
あれやこれやと命令を追加していくうちに，やり方がわかってきて，割り込みコントローラや周辺デバイス(CAN, A/D変換器等など）必要なものは自分で作れるようになっていました(★)．
(★)自分で作るからこそ，必要な機能作成やチューニングができる点が良いですね．

その当時は，自作エミュレータでのデバッグはやはり大変でしたが，日々わくわくしながら仕事してました．そんな中，自作エミュレータ上で移植した OS が PC 上で動かすことができたときは本当に嬉しかったです(下図は，その当時の OS 起動メッセージです)．

```
TOPPERS/ASP3 Kernel Release 3.2.0 for V850-ESFK3 
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2017 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN
```

さらに，その OS を実機上に焼き込み，エミュレータと同じように起動⇒ CAN データの送受ができたときの感激はずっと忘れないと思います(とても暑い日でした)．

当時は，単に「CPU エミュレータ」っていう名前で呼んでいましたが，[第7回TOPPERS活用アイデア・アプリケーション開発コンテスト](https://www.toppers.jp/contest.html) への応募という目標ができて正式な名前をつけることにしました．

「わくわく」を英訳し，「athrill(アスリル)」で即決です．![athrill.png](https://qiita-image-store.s3.amazonaws.com/0/244147/310461c9-5fba-3f82-c535-75d704638526.png)

# 関連記事
* [athrill(アスリル) を使用して TOPPERS OS(ASP3) をデバッグ](https://qiita.com/kanetugu2018/items/1f2ef93c9e1fa7a29f97)
* [マルチコア対応仮想環境(athrill)を使用して TOPPERS/ATK2 を実行する](https://qiita.com/kanetugu2018/items/b43c5715124f42a0393d)
* [メモリ保護対応版 athrill(アスリル) のご紹介](https://qiita.com/kanetugu2018/items/f2205475c4a4eae699c0)
* [athrill(アスリル)を使用してC言語ポインタ変数を理解する](https://qiita.com/kanetugu2018/items/b9ad84c2f74324174864)
* [athrill(アスリル)機能マニュアル](https://qiita.com/kanetugu2018/items/cf3dea16710a3f0737e8)
* [athrill(アスリル) を使用してベアメタル・プログラミング(１回目：main関数が動き出すまで)](https://qiita.com/kanetugu2018/items/7d2ce8def53cb9bda06b)
* [athrill(アスリル) を使用してベアメタル・プログラミング(2回目：割り込みがソフトウェアに通知されるまで)](https://qiita.com/kanetugu2018/items/8cb411717511ca96bc64)
* [WSLでマイコンシミュレータ環境(athrill)をつくる](https://qiita.com/Maeda-Shoota/items/4b1be75a6c4993522ab1)
* [TOPPERS/ATK2カーネル向け実機レス環境(athrill2)](https://qiita.com/kanetugu2018/items/75dadc340f3db2a344ab)