男npm，direnv，node-casl2-comet2らによるアセンブラ体験

### ちょっとだけCASLⅡとCOMETⅡ絡みのおべんきょがあった
流石に4日だけじゃ0からスタートして浮動小数点のIOと四則演算の実装なんてのは無理だったな
#### 内容
ひみつ♡（もうちょい経ったら後悔するかも）

## CASLⅡとCOMETⅡのシミュレーション環境といえば
### IPA本家のライブラリ（Javaで動く）
[こ↑こ↓](https://www.jitec.ipa.go.jp/1_20casl2/casl2dl_001.html)
でもオラJava使ったことはねぇし，Java SE 8はライセンスがダメで無料じゃ使えねぇって聞いたぞ…
触ったことのねぇJDKってやつやOpenJDKってやつやAdoptOpenJDKってやつに立ち向かって環境構築して，そっから更にCASLⅡとCOMETⅡに触れるってのは，いくらなんでも素人には無理があっぞ！
### いろんなWebサイト
でもオラ途中でぜってぇ嫌になっぞ！VSCodeとterminalでパチパチやりてぇんだ！
### 古の謎exeファイル
macOS Catalinaが実行を許すわけねぇだろ！？

## 救いの手
[最強のCASL2/COMET2環境](https://qiita.com/maxfie1d/items/9f75cc16f938f2cd1844)
by @maxfie1d
ひゃ〜，こりゃどえれぇガチプロ様に出会った！オラとてもラッキーだ！
npmなら昨年ちょこっと触ったことがあったからな！いける気がすっぞ！




# 方針
+ `npm`があるといいよね
  + `node`はそんなに関係しないよ
+ `direnv`で環境を組み分けよう
+ `node-casl2-comet2`を利用させていただく
+ ついでに`VScode`の機能拡張についてもだな…
+ すみません，まだ`bash`を使っています…
  + そもそも開発者ではないので…nodeあたりのツッコミどころ満載ですよね．すんません




# 準備



## `homebrew`を揃える
同じような情報はいっぱいあるだろう，それを踏まえながら[公式サイト](https://brew.sh)を見れば良いのではないか…？



## `node`,`nodenv`,`npm`を揃える

```bash:bash
$ brew install nodenv
```

##### ここで`$PATH`チェックだ

```bash:.bashrc
export PATH=$HOME/.nodenv/shims:usr/local/bin/nodenv:$PATH
```

```bash:bash
$ source ~/.bashrc
```

人によっては違うかもしれねェが…ウチの`nodenv`も`node`も`npm`もコレで動き続けている…

```bash:bash
$ nodenv install -list
```

今回はそこまで関係ないと思うが，取り敢えず新しいものを入れておこう…

```bash:bash
$ nodenv install 15.3.0
```

すると勝手に`npm`がついてくるはずだ…ということで

```bash:bash
$ node -v
$ npm -v
```

を打ってちゃんとバージョンが表示されたら成功だ…



## `direnv`を揃える
今回のサブ主役だ…

```bash:bash
$ brew install direnv
```

##### ここで`$PATH`チェックだ
詳しい動作はあとでやるがここでおまじないだ，この文

```bash:.bashrc
eval "$(direnv hook bash)"
```

を`.bashrc`に**付け加えて**からもう一度

```bash:bash
$ source ~/.bashrc
```

詳しい解説は[いまさら direnv の解説](https://qiita.com/ngyuki/items/fda1bbf29384bef7a805) by @ngyuki にある，そちらを参照されたし…
更にこれが有名かどうかわからないので[公式ドキュメント](https://direnv.net)を貼っておく．
`bash`に`hook`したのは見てわかるけど，なんでコレで動くのかがわからない…



## `node-casl2-comet2`を揃える
アセンブラファイルを置いときたいディレクトリに行ったら

```bash:bash
$ npm install @maxfield/node-comet2
```

なお，`npm init`をする必要はないもよう

#### えっグローバルインストールじゃないやん
たしかにIPAの試験に立ち向かうためならいっそ気合入れてグローバルインストールしても良いかもしれません．
その場合は

```bash:bash
$ npm -g install @maxfield/node-comet2
$ npm root -g
```

でちゃんとパスを確認して，通ってなかったら同じ要領でパスに追記してあげてください…
そしたら`direnv`の出る幕もないと思われます…

（私はただ`-g`に入れた後の管理をやりたくないからやめといただけです）



## VSCodeのインストール
同じような情報はいっぱいあると思うけど，とりあえず[公式サイト](https://code.visualstudio.com/docs/setup/mac)を読めばわかるんじゃないかな…？

##### ここで`$PATH`チェックだ
⌘+Pで出てきた場所に`>Shell`って打つと`Shell Command: Install 'code' command in PATH`って出るのでやっておこう，`/usr/local/bin/code`のシンボルが生成されるので`bash`の`$PATH`のレンジに入る

##### ここで`$EDITOR`チェックだ
更にさっきの要領で

```bash:.bashrc
export EDITOR=code
```

を継ぎ足して

```bash:bash
$ source ~/.bashrc
```

…これでデフォルトの`$EDITOR`がVSCodeになったよ！~~他のエディタ？知りませんね…~~



## `direnv`の本領発揮
`node-comet2`のシンボルは`./node_modules/.bin`にあるがそんなパスは用意していないし，かと言ってわざわざ`.bashrc`に書き込む気も起きない，だからディレクトリごとにそこら辺を弄れる`direnv`を召喚した…！
（だからこういう場所で何も考えずに連打しても`command not found`しか出ない，`node`とは事情が違う）


### `.envrc`を作る

```bash:bash
$ direnv edit . #.←これ必要
```

ここで`$EDITOR`が通ってなくてエラーを吐かれてしまった…あると一発でVSCodeが開く


### `.envrc`を書く

```bash:.envrc
export PATH=$PATH:./node_modules/.bin
```

保存OK？


## `direnv`を起動させる
その場で

```bash:bash
$ direnv allow
```

はい，これでこのディレクトリの変数が書き換わりましたっ…！

ちなみにそこから出ると

```bash:bash
direnv: unloading
```

また入ると

```bash:bash
direnv: loading ~/xxx/yyy/.envrc
```




# 実験
ここからがようやくいよいよアセンブラの世界だ…



## ファイル生成

```bash:bash
$ touch test.cas
```

アセンブリファイルの拡張子は`.cas`で固定っす．



## ファイル編集
超絶簡単なモノで良いっすか？

```:test.cas
IO      START
        IN      INPUT,   INPUTL
        OUT     INPUT,   INPUTL
        RET
INPUT   DS      256
INPUTL  DS      1
        END
```

本当にただ吸って吐くだけなんですけど…
（アセンブラそのものに関しては，ちゃんとすごい人の記事をみなさま読んでください，私も読もうとしています）



## コンパイル

```bash:bash
$ node-casl2 example.cas 
```

これでよし
（オプションとかは製作者様の[github](https://github.com/node-casl2-comet2/node-casl2)を参照）



## 実行

```bash:bash
$ node-comet2 example.com
```

実行ファイルの拡張子は`.com`で固定っす．
するとこんな画面が現れます


```:node-comet2
PR  #0000 (     0) [IN     #0007, #0107        ] STEP 0
SP  #FFFF ( 65535) OF: ↓ SF: ↓ ZF: ↓
GR0 #0000 (     0) GR1 #0000 (     0) GR2 #0000 (     0) GR3 #0000 (     0)
GR4 #0000 (     0) GR5 #0000 (     0) GR6 #0000 (     0) GR7 #0000 (     0)
> s
> argaethasjtsrjryjs
PR  #0003 (     3) [OUT    #0007, #0107        ] STEP 1
SP  #FFFF ( 65535) OF: ↓ SF: ↓ ZF: ↓
GR0 #0000 (     0) GR1 #0000 (     0) GR2 #0000 (     0) GR3 #0000 (     0)
GR4 #0000 (     0) GR5 #0000 (     0) GR6 #0000 (     0) GR7 #0000 (     0)
> s
argaethasjtsrjryjs
PR  #0006 (     6) [RET                        ] STEP 2
SP  #FFFF ( 65535) OF: ↓ SF: ↓ ZF: ↓
GR0 #0000 (     0) GR1 #0000 (     0) GR2 #0000 (     0) GR3 #0000 (     0)
GR4 #0000 (     0) GR5 #0000 (     0) GR6 #0000 (     0) GR7 #0000 (     0)
> s
```

`> s`は実行オプションで

```:node-comet2
h    対話モードのヘルプを表示します。
q    プログラムの実行を終了します。
r    対話モードを終了してプログラムを実行します。
s    命令を1つ実行します(ステップ実行)。
```

のどれかを押してEnterすると進みます

そう，レジスタや関係する主記憶の動きを刻々と追跡できる！これはすげぇ…

#### 経過が要らないなら

```bash:bash
$ node-comet2 -r example.com
```

それでも入力が求められた時は流石に止まりますけど…




# 感想
ライブラリが整備されているCってとっても高級な言語なんだなぁと…
符号付き整数のIOの実装だけで苦しみました，浮動小数点のIOの実装なんて今の私には全く無理でした…ヒェッ…


### おま○け
CASLⅡ・COMETⅡむけのVSCodeの拡張機能！…も，@maxfie1d様製だった…
これがガチプロの世界か…
（色々やれることが多すぎてまーったく使いこなせてないけど補完は助かる）

![スクリーンショット 2020-12-01 18.15.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540440/fed96ffb-b2e3-73f2-d1e2-c62528bad848.png)