TISA — Tiny ISA エミュレータ
概要
TISA は「Tiny ISA」を模した小規模な命令セットのエミュレータです。ソースは C 言語で書かれており、CMake ベースでビルドします。ユーザーはアセンブリ形式(例: input.s)のファイルを与えて実行し、レジスタやメモリの状態を確認できます。サポートされる命令は基本的な算術演算(ADD, SUB, MUL, DIV)、条件分岐(BRZ: ゼロ分岐、BRNZ: 非ゼロ分岐、BRLZ/BRGZ: 符号付き比較による分岐)、間接分岐(IBRZ: メモリ間接ジャンプ)、およびデータ移動(MOV)など。シンプルかつ教育的な実装のため、命令セットやエミュレータ基礎を学ぶのに向いています。(約300字)
リポジトリの統計情報
- スター数: 142
- フォーク数: 0
- ウォッチャー数: 142
- コミット数: 13
- ファイル数: 10
- メインの言語: C
主な特徴
- シンプルな Tiny ISA のフルエミュレーション(算術・分岐・間接分岐・移動命令をサポート)
- C/CMake による移植性の高い実装(Unix 系で容易にビルド可能)
- 入力アセンブラファイルを読み込んで実行、—dump オプションで状態表示
- 学習・実験用途に適した軽量で可読性の高いコード構造
技術的なポイント
TISA は典型的なソフトウェアエミュレータのアーキテクチャに従い、フェッチ→デコード→実行のループで命令を処理します。コンパクトな実装のため、命令セット定義と実行ロジックが明快に分離されているのが特徴です。context.c ではおそらく CPU コンテキスト(レジスタファイル、プログラムカウンタ、メモリ領域など)を管理し、decode.c がテキスト形式のアセンブリを解析して内部表現へ変換する役割を担っています。命令レベルでは ADD/SUB/MUL/DIV といった算術命令が実装され、符号付き比較に基づく BRLZ/BRGZ やゼロ判定の BRZ/BRNZ によって制御フローを変化させます。IBRZ は間接ジャンプで、条件成立時に指定アドレスのメモリ内容をプログラムカウンタにロードする命令であり、これにより動的な遷移が可能です。
入力はアセンブリ風のテキスト(例: input.s)で与えられ、デコーダが各行をパースして命令とオペランドに分解します。実行時に発生しうる注意点としては、除算におけるゼロ除算処理、メモリアクセスの境界チェック、命令パラメータの妥当性検証などが挙げられます。現状は教育目的向けのシンプル設計のため、エラー処理や保護機構は最小限に留められている可能性があり、拡張や本格的な検証環境を作る際には追加のテストや安全性対策(サニタイズ、境界検査、詳細なエラーメッセージ)が必要です。
C 言語実装の利点は、低レイヤでの動作理解や最適化(例えば命令テーブルの最適化、スイッチ分岐の工夫、バイトコード化など)を学べる点です。CMake によるビルド構成はプラットフォーム間の移植を容易にし、既存の拡張(メモリマップ I/O、割り込み、デバッガ機能、簡易アセンブラ)を追加する基盤として適しています。—dump オプションはデバッグ/学習用途に有用で、実行後にレジスタやメモリのスナップショットを出力し、命令の影響を追跡できます。
(約700字)
プロジェクトの構成
主要なファイルとディレクトリ:
- .gitignore: file
- CMakeLists.txt: file
- README.md: file
- context.c: file
- decode.c: file
…他 5 ファイル
補足:
- ビルド手順は README に従い、build ディレクトリで cmake .. / make を実行してバイナリ(./tisa)を作成します。
- 実行例: ./tisa ../input.s —dump
- README に命令リストが列挙されており、どの命令がサポートされているかが明記されています。
まとめ
教育や小規模実験に最適な、読みやすく拡張しやすい Tiny ISA エミュレータです。(約50字)
リポジトリ情報:
- 名前: tisa
- 説明: tisa is an emulator for the Tiny ISA
- スター数: 142
- 言語: C
- URL: https://github.com/SouzaFrontend/tisa
- オーナー: SouzaFrontend
- アバター: https://avatars.githubusercontent.com/u/49634266?v=4
READMEの抜粋:
TISA
TISA stands for Tiny ISA.
Bulding and executing
For building the project we’re using cmake.
mkdir build
cd build
cmake ..
make
Then run with:
./tisa ../input.s --dump
Supported instructions
- ADD rx, ry // rx = rx + ry
- SUB rx, ry
- DIV rx, ry
- MUL rx, ry
- BRZ rx, DES // PC += DES se rx = 0
- BRNZ rx, DES // PC += DES se rx != 0
- BRLZ rx, DES // PC += DES se rx < 0
- BRGZ rx, DES // PC += DES se rx > 0
- IBRZ rx, ADR // PC = MEM(ADR) se rx = 0
- MOV rx, ry // rx …