編集履歴一覧に戻る
mikecatのアイコン画像

mikecat が 2022年12月10日10時00分11秒 に編集

初版

タイトルの変更

+

IchigoJam で TD4 エミュレータ

タグの変更

+

IchigoJam

+

TD4

+

CPUの創りかた

+

エミュレーター

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

ライセンスの変更

+

(CC BY 4+) Creative Commons Attribution CC BY version 4.0 or later

本文の変更

+

++[IchigoJam Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ichigojam) 10日目++ [IchigoJam](https://ichigojam.net/) 上でTD4 のエミュレータを作ってみた。 # 仕様 * クロックの切り替え、およびリセットはキーボード (またはシリアル通信) で行う * `R` : リセット * `J` : 手動クロックに切り替え * `K` : 1Hzクロックに切り替え * `L` : 10Hzクロックに切り替え * 入力ポート、および出力ポートはそれぞれ IN1~4 および OUT1~4 に対応する * 手動クロックは、デフォルトで載っているボタン (BTN) を押すことで入力する * ROM の編集機能は無い。`LET` 命令などで配列の `[0]` ~ `[15]` にプログラムを入れてから実行する # プログラム ``` 10 ' TD4 エミュレータ 20 CLS:LC4,3:?"ROM":FORI=0TO#F:LC4,4+I:?HEX$(I);" ";BIN$([I],8):NEXT:LC19,3:?"レジスタ":LC21,4:?"A":LC21,5:?"B":LC21,6:?"C":LC20,8:?"PC":LC19,11:?"ポート":LC20,12:?"IN":LC19,13:?"OUT" 30 LC19,16:?"クロック":LC21,17:?"J BTN":LC21,18:?"K 1Hz":LC21,19:?"L 10Hz":D=1:E=1:F=1:J=-1:V=1:L=3:Q=1:N=0:IFVER()<14114S=60ELSES=VER(4) 40 R=S/10:IFVER()>13207IFVER(1)=3S=S*25/96:R=R/4 50 K=0:A=0:B=0:C=0:P=0:U=0 60 IFU-VOUTU:LC23,13:?BIN$(U,4):V=U 70 IFA-DLC23,4:?BIN$(A,4):D=A 80 IFB-ELC23,5:?BIN$(B,4):E=B 90 IFC-FLC23,6:?C:F=C 100 IFP-QLC23,8:?BIN$(P,4):LC3,4+Q:?" ":LC3,4+P:?CHR$(#E1):Q=P 110 I=IN()&#F:IFI-JLC23,12:?BIN$(I,4):J=I 120 IFK-LLC20,17+L:?" ":LC20,17+K:?CHR$(#E1):L=K 130 N=N*2+!!BTN():X=INKEY()&#DF-74:IFX=8GOTO50ELSEIFX=0K=0ELSEIFX=1K=1:Y=S:T=Y:CLTELSEIFX=2K=2:Y=R:T=Y:CLT 140 IF!KANDN&3=1GOTO150ELSEIFKANDTICK()>=TT=T+Y:GOTO150ELSEGOTO110 150 IFTICK()>=32175CLT:T=Y 160 G=[P]:X=G>>6:Z=G>>4&3|X/2:W=A*!Z+B*(Z=1)+I*(Z=2)+G&#F:H=W&#F:IF!XA=H 170 IFX=1B=H 180 IFX=2U=H 190 IFX=3AND!C|G&16P=HELSEP=-~P&#F 200 C=W>>4:GOTO60 ``` (記事に設定している通り CC BY ライセンスです) # 実行結果 例のラーメンタイマーを実行した。 @[youtube](https://www.youtube.com/watch?v=5Nahyo0fYJw) # 解説 * 10行目:タイトル * 20行目:UI要素のうち変わらない部分の描画 * 30行目 * UI要素のうち変わらない部分の描画の続き * 描画状態とボタン入力状態の初期化 * 環境に合わせたウェイト時間の設定 (PAL対応) * 40行目 * 10Hzクロック用のウェイト時間の設定 * 環境に合わせたウェイト時間の設定 (IchigoJam web対応) * 50行目:レジスタとクロック設定のリセット * 60行目~120行目 * 変化した状態の描画 * ポートの入出力 * 130行目 * ボタンの状態の更新 * キーボード操作の受付 * 140行目:1ステップ実行するかの判定・実行 * 150行目:なるべく精度を保ちつつ `TICK()` のオーバーフローを回避する処理 * 160行目~200行目:1ステップ実行する処理 * [CPUの創りかた TD4](http://xyama.sakura.ne.jp/hp/4bitCPU_TD4.html) に掲載されている回路図をもとに実装した * 160行目:命令フェッチ、データ取得元および更新先の取得、加算、Aレジスタの更新 * 170行目:Bレジスタの更新 * 180行目:出力ポートの更新 * 190行目:プログラムカウンタの更新 * 200行目:フラグの更新 # 関連リンク * [CPUの創りかた | マイナビブックス](https://book.mynavi.jp/ec/products/detail/id=22065) * 4ビットCPU「TD4」の出典。 * [憧れのCPUづくりが超簡単!あの4bitコンピューターTD4マシン語プログラム on FPGA MAX10](https://fukuno.jig.jp/2247) * TD4 を FPGA 上で動作させる方法の紹介。 * [TD4 CPU EMULATER](https://seibe.jp/td4/) * TD4 の動作を IC レベルで図示してくれる。 # おわりに ※IchigoJamはjig.jpの登録商標です。