Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rubyで作る論理回路シミュレータ - Shinjuku.rb #99

Rubyで作る論理回路シミュレータ - Shinjuku.rb #99

Avatar for Koji NAKAMURA

Koji NAKAMURA

May 27, 2025
Tweet

More Decks by Koji NAKAMURA

Other Decks in Technology

Transcript

  1. KaigiEffect により作ったもの: logicuit • logi(c cir)cuit -> logicuit • 電気回路シミュレータ

    • 書籍「CPUの創りかた」を理解したくて作った • https://www.amazon.co.jp/dp/4839909865/
  2. 1-bit CPU CK D Q • A レジスタの内容を反転して A レジスタに転送

    • NOT A を繰り返すだけ • ↑ アセンブリ言語
  3. MOV A, Im : A レジスタに Im を転送 イミディエイトデータ 0000

    入力ポート 出力ポート データセレクタ Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3
  4. MOV A, B : A レジスタに B レジスタを転送 イミディエイトデータ 0000

    入力ポート 出力ポート データセレクタ Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3
  5. ADD B, Im : B レジスタに Im を加算 イミディエイトデータ 0000

    入力ポート 出力ポート データセレクタ Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3
  6. IN A : 入力ポートから A レジスタへ転送 イミディエイトデータ 0000 入力ポート 出力ポート

    データセレクタ Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3
  7. OUT Im : 出力ポートへ Im を転送 イミディエイトデータ 0000 入力ポート 出力ポート

    データセレクタ Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3
  8. JMP Im : Im 番地へジャンプ イミディエイトデータ 0000 入力ポート 出力ポート データセレクタ

    Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3
  9. JNC Im : C フラグが1ではないときにジャンプ イミディエイトデータ 0000 入力ポート 出力ポート データセレクタ

    Aレジスタ Bレジスタ 出力ポート プログラムカウンタ SELECT A SELECT B A B C3 C2 C1 C0 ALU LD0 LD1 LD2 LD3 ※CフラグはALUで桁上がりが発生したら 1 がセットされる
  10. まとめ • 本当に CPU が動きました! • CPUと内部DSLに興味がわいたら logicuit を試してね •

    内部 DSL を設計して実装するの勉強になる&楽しい • 何かを理解したくて Ruby でイチから実装はオススメ • Let’s KaigiEffect !!!