vm2gol v2 製作メモ(1) 最初のVM



とにかく始める

とにかくやるのだぁ

(『30日でできる! OS自作入門』 p14)


とりあえずアレですよね? レジスタとメモリがあるんですよね? などといって適当に書き始めます。 慣れていてサッと始められるので Ruby です。 サッと始められるの大事です。

# coding: utf-8
require "pp"

class Vm
  def initialize
    # register
    @reg_a = 0
    @reg_b = 0
    @reg_c = 0

    @mem = Array.new(8, 0) # サイズ8、0で初期化
  end

  def set_mem(addr, n)
    @mem[addr] = n
  end

  def copy_mem_to_reg_a(addr)
    @reg_a = @mem[addr]
  end

  def copy_mem_to_reg_b(addr)
    @reg_b = @mem[addr]
  end

  def copy_reg_c_to_mem(addr)
    @mem[addr] = @reg_c
  end

  def add_ab
    @reg_c = @reg_a + @reg_b
  end
end

vm = Vm.new
pp vm # 初期状態

vm.set_mem(0, 1)
vm.set_mem(1, 2)
pp vm # ★1

vm.copy_mem_to_reg_a(0)
vm.copy_mem_to_reg_b(1)
pp vm # ★2

vm.add_ab
vm.copy_reg_c_to_mem(2)
pp vm # ★3

★1 なにはともあれメモリに値をセットする。 0番地に 1 が、1番地に 2 が入っていればOK。

★2 メモリの値をレジスタにコピーしてみる。 reg_a が 1 に、reg_b が 2 になっていればOK。

★3 足し算して結果を reg_c に入れて、それをメモリにコピーする、というのをやってみる。 reg_c とメモリの 2番地に 3 が入っていればOK。

$ ruby vgvm.rb
#<Vm:0x005650ed9eaa40
     @mem=[0, 0, 0, 0, 0, 0, 0, 0],
     @reg_a=0,
     @reg_b=0,
     @reg_c=0> ... 初期状態
#<Vm:0x005650ed9eaa40
     @mem=[1, 2, 0, 0, 0, 0, 0, 0],
     @reg_a=0,
     @reg_b=0,
     @reg_c=0> ... ★1
#<Vm:0x005650ed9eaa40
     @mem=[1, 2, 0, 0, 0, 0, 0, 0],
     @reg_a=1,
     @reg_b=2,
     @reg_c=0> ... ★2
#<Vm:0x005650ed9eaa40
     @mem=[1, 2, 3, 0, 0, 0, 0, 0],
     @reg_a=1,
     @reg_b=2,
     @reg_c=3> ... ★3

はい。

ちょっとあっさりしすぎですがこんな感じで始めました。 最初なのでこんなもんで。

余談

足し算のところは、下記のようにして桁あふれのエミュレーションもやってましたが 最終的に使わなくなったので消しました。

sum = @reg_a + @reg_b
if sum >= 16
  @reg_c = sum - 16
  @of = 1 # オーバーフローフラグ
else
  @reg_c = sum
end

雑に作る

(2024-01-13 追記)

雑に作る』という本に大変すばらしいことが書かれていたので引用します。

「雑の極意」

一、気軽に作り始めること
一、完成度は低くてもまずは完成させること
一、見た目にこだわらないこと
一、1つの傑作より10の駄作を作ること
一、広く深く学ぶより、いま必要なことを学ぶこと
一、1つの技術で10作品作ること
一、「雑」をよいことととらえること

人はついつい、作品を作る前に「傑作を作るぞ!」と意気込んでしまいがちだ。そして実際に作ってみると想像していたようにいかず、途中で飽きて投げ出してしまう。工作あるあるのなかでもかなり上位にランクインするあるあるだろう。

そこで「雑に作る」の精神だ。長い期間かけて立派な作品を作るのではなく、3日で雑な小品を1つ作る。気軽に始めて、飽きる前に終わらせるのだ。そうすればあなたの作品集に1つ作品が増える。そしてそんな雑な作品をどんどん作り続けるうちに、いつのまにかあなたはいろんな電子部品の使い方を覚え、複雑な機構も組めるようになり、大作を作り上げるだけの実力を手に入れていることだろう!

まさにこれです。この精神でやっていきます。