mikecatのアイコン画像
mikecat 2022年12月10日作成 © CC BY 4+
製作品 製作品 閲覧数 1255
mikecat 2022年12月10日作成 © CC BY 4+ 製作品 製作品 閲覧数 1255

IchigoJam で TD4 エミュレータ

IchigoJam で TD4 エミュレータ

IchigoJam Advent Calendar 2022 10日目

IchigoJam 上で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 ライセンスです)

実行結果

例のラーメンタイマーを実行した。

ここに動画が表示されます

解説

  • 10行目:タイトル
  • 20行目:UI要素のうち変わらない部分の描画
  • 30行目
    • UI要素のうち変わらない部分の描画の続き
    • 描画状態とボタン入力状態の初期化
    • 環境に合わせたウェイト時間の設定 (PAL対応)
  • 40行目
    • 10Hzクロック用のウェイト時間の設定
    • 環境に合わせたウェイト時間の設定 (IchigoJam web対応)
  • 50行目:レジスタとクロック設定のリセット
  • 60行目~120行目
    • 変化した状態の描画
    • ポートの入出力
  • 130行目
    • ボタンの状態の更新
    • キーボード操作の受付
  • 140行目:1ステップ実行するかの判定・実行
  • 150行目:なるべく精度を保ちつつ TICK() のオーバーフローを回避する処理
  • 160行目~200行目:1ステップ実行する処理
    • CPUの創りかた TD4 に掲載されている回路図をもとに実装した
    • 160行目:命令フェッチ、データ取得元および更新先の取得、加算、Aレジスタの更新
    • 170行目:Bレジスタの更新
    • 180行目:出力ポートの更新
    • 190行目:プログラムカウンタの更新
    • 200行目:フラグの更新

関連リンク

おわりに

※IchigoJamはjig.jpの登録商標です。

1
  • mikecat さんが 2022/12/10 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する