windowsでiverilog その166

# 概要　
windowsでiverilogやってみた。
cpu見つけたので、勝手にマシン語、作ってみた。
アセンブラが動くインタープリター書いてみた。

# 参考にしたページ

https://qiita.com/KajizukaTaichi/items/2da92161db1355466b5c

# 写真


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1dd1783b-ff2d-48f3-8ca7-62e0cfce90b7.png)

# 投入したソース

```
main  psh  5       
  psh  8
  psh  2
  cal  sum     
  pop  ar      
  mov  ba  8   
  sta  ba  ar  
  mov  va  ar
  hlt         
sum  mov  ar  0           
loop_start  mov  cr  sp
  nor  cr  cr          
  jmp  cr  loop_end    
loop_body  pop  dr              
  add  ar  dr          
  jmp  1  loop_start   
loop_end  psh  ar              
  ret

```

# 実行結果

```
AR : 15
CR : 1
DR : 5
BA : 8
SP : 0
VA : 15

```

# サンプルコード

```

var src = document.getElementById('src');
var out = document.getElementById('out');
var stack = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

function spush() {
  for (var i = 10; i > 0; i--)
		stack[i] = stack[i - 1];
}
function spop() {
  for (var i = 0; i < 9; i++)
		stack[i] = stack[i + 1];
}

function run() {
	var la = [];
	var pc = 0;
	var AR = 0;
	var CR = 0;
	var DR = 0;
 	var BA = 0;
	var SP = 0;
  var RA = 0;
	var ram = [];
  var i = 0;
  var j = 1;
	var str = src.value; 
  var codes = str.split("\n");  
  var len = codes.length - 1;
	for (i = 0; i < len; i++)
	{
		var cm = codes[i].split("  ");
		if (cm[0] != "")
		{
			la[cm[0]] = i;
		}
	}
  while (j > 0)
  {
		//alert(codes[pc]);
    var code = codes[pc].split("  ");
    //alert(code[1]);
    switch (code[1])
    {
    case "psh":
      spush();
      if (code[2] == "ar") 
      {
        stack[0] = AR;
      }
      else
      {  
        stack[0] = parseFloat(code[2]);
      }
      //alert(stack[0]);
      //alert(stack[1]);
      //alert(stack[2]);
      SP++;
      pc++;
    break;
    case "pop":
      //alert(stack[0]);
      if (code[2] == "ar") 
      {
        AR = stack[0];
      }
      else
      {  
        DR = stack[0];
      }
      spop();
      SP--;
      pc++;
    break;
    case "sta":
      ram[BA] = AR;
      pc++;
    break;
    case "nor":
      if (CR == 0)
      {
        CR = 1;
      }
      else
      {
        CR = 0; 
      }
      pc++;
    break; 
    case "mov":
      if (code[2] == "va") 
      {
        VA = AR;
      }
      else if (code[2] == "ba")
      {
        BA = parseFloat(code[3]);
      } 
      else if (code[3] == "sp")
      {
        CR = SP;
      } 
      else 
      {
        AR = parseFloat(code[3]);
      }
      pc++;
    break; 
    case "add":  
      if (code[3] == "dr") 
      {
        AR = AR + DR;
        //alert(AR);
      }
      pc++;
    break;
    case "cal": 
      RA = pc + 1;
      pc = la[code[2]];
    break;
    case "ret":  
      pc = RA;
    break;
    case "jmp": 
      if (code[2] == "1")
      {
        pc = la[code[3]];
      }
      else if (code[2] == "cr")
      {
        if (CR == 1)
        {
          pc = la[code[3]];
        }
        else
        {
          pc++;
        }
      }
      else
      {
        pc++;
      }
    break;
    case "hlt":
      //alert("hlt");
      j = 0;
    break;
    default:
      pc++;
    break;
    }
  }
  out.value += "AR : " + AR + "\n";
  out.value += "CR : " + CR + "\n";
  out.value += "DR : " + DR + "\n";
  out.value += "BA : " + BA + "\n";
  out.value += "SP : " + SP + "\n";
  out.value += "VA : " + VA + "\n";
}




```

# 成果物

https://embed.plnkr.co/plunk/tSUv8tbEs7CdhY86

以上。