C言語開発環境を構築しよう! ～超遠回り編～

**この記事は[Tokyo City University Advent Calendar 2019](https://adventar.org/calendars/4282)の4日目の記事です**

C言語の開発環境、たくさんありますよね。一番手軽なところだと、Windows用のgccとメモ帳があればとりあえずできます。また、VisualStudioやCLionなどのIDEを使う方法もあります。
それらのやり方はいちいち今からQiitaに書かなくてもいくらでも情報が転がっています。ところが、なかなかポータブルな環境構築というのは見かけません。大学の備え付けPCやネカフェのPCなど手持ち以外のPCで使おうとしても、パスを通したりエディタの設定を云々したりが必要で、なかなかポータブルな環境構築というのも難しいものです。
そこで、今回は**ポータブルなC言語開発環境を**(ものすごい遠回りして(結局実用性があまりない状態で))作っていきましょう! ~~100%ネタです~~

## 必要なもの
- **MS-DOS 6.2**のインストールイメージ(今回はPC-9801用を使用しました)
- NP21/W (普通のNekoProject2でもいいですけどね)
    - PC9821エミュレータ(LinuxのWineだと動いた。macだとだめ)
    - リンク:https://sites.google.com/site/np21win/download
- LSI C-86 Ver.3.30 試食版
    - Cコンパイラ
    - https://www.vector.co.jp/soft/maker/lsi/se001169.html
- DiskExplorer
    - 仮想HDDイメージやFDイメージを開くためのソフト
    - https://hp.vector.co.jp/authors/VA013937/editdisk/index.html
- (DOS用テキストエディタは載せてません。各自お好きなものを探してみてください。)

## 1. PC-98(NP21/W)を起動する
環境にMS-DOSを使うため、PC-98シリーズの仮想マシンを使います。
先述のサイトからNP21/WのZIPファイルをダウンロードし、展開しましょう。
「9801」「language」「np2.chm」「np21w.exe」「np21x64w.exe」の5つが展開されたはずです。
まずは、「np21x64w.exe」を起動します(x86なOSならnp21w.exe)

Windows10だとSmartScreenに引っかかりますが、「詳細情報」→「実行する」で起動ます。

起動すると、「ﾋﾟﾎﾟｯ!」と起動音が流れながら、メモリチェックが行われます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/6831ade4-f728-423a-a755-f89b1ab15041.png)
なにもイメージを割り当ててないので、「システムディスクをセットしてください」となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/41853b64-50ad-3a6c-89dd-48b0ef55c3af.png)

### CPUの速度を変える
せっかく実機PC-9801/21よりはるかに早いコンピュータを使っていますので、夢の爆速マシンにしましょう。
「Emulate」メニュー→「Configure...」より、CPUの欄のプルダウンメニューで、20→42にしましょう。
次起動するときは「ﾋﾟﾎﾟｯ」が一瞬しか聞こえません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/7e8fae7c-8129-53cf-7ef1-0d143d8a5aee.png)


## 2. HDDイメージを作成する
左上の「Emulate」メニュー→「New disk」→「Hard disk image...」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/8a1e8e63-8bb5-89d2-1617-c0bee9e8339b.png)
ファイル保存ダイアログが出るので、好きな名前を付けて保存しましょう。
この時、ファイルの種類が決められますが、「.nhd」で良いと思います。

次にファイルサイズを決めます。MS-DOS 6.2がとりあえず読める最大サイズが2047MBバイトなので、精神衛生的に2048MBにしました。(容量固定式なので、指定したサイズのファイルがいきなり生成されます。ご注意ください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/3da51abf-34b7-ab52-5997-dd6e27813886.png)

「OK」を押すと、HDイメージが作成されます。

次に、作成したイメージを割り当てます。
「Harddisk」メニュー→「IDE #0」→「Open」より、先ほど作成したファイルを選択します。

これで最初の作業は終了です。

## 3. MS-DOSをインストールする
一番めんどくさい作業です。
「FDD1」メニュー→「Open」より、インストールフロッピィイメージの1枚目を開きます。
(以下、MS-DOS側に合わせ、フロッピーではなくフロッピィ表記を使用します)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/da1c0743-4bf8-ca48-59eb-7be91f71112b.png)

「Emulate」メニュー→「Reset」で再起動します。

再起動すると、インストール先を聞かれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/a336c1f1-2805-4294-725c-070ee5477c9b.png)
固定ディスクを選択します

ディスクの初期化をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/07d1afc5-b5ef-d9c2-77da-46fd334dfb9e.png)

勝手に初期化してくれます。便利ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/3e609e30-c8e9-e7a5-210d-e7086e3db6e1.png)

完了すると、MS-DOS領域の作成です。何も考えずEnter押して大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/9f7c4e20-1d06-1bf7-dccf-6dda3f688281.png)

確認されるので、「はい」で続行します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/8114b403-a458-2038-7eea-484a77f3ecb5.png)

何やらすごいプログレスバーが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/8d0622ad-b826-7024-f363-0fa402ee9e08.png)

勝手に再起動して、インストールが続行されます。
まず、インストール先のディレクトリの指定です。このままEnterを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/80a15df9-9536-453f-393d-0b34cd6486ba.png)
先程のように確認されるので、「はい」で続行します

二枚目のフロッピィディスクを入れろと言われるので、先程と同じ様に「FDD1」メニューより、2枚目のフロッピィディスクを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/d2300036-7de3-b794-4cb1-d5abd23da1aa.png)
入れたらEnterキーを押します。自動でファイルコピーが行われます。これを8枚目まで行います。
(仮想だから転送早いですけど、実機だとものすごい時間かかるんだろうなと)

8枚目まで終わると、環境設定が出てきます。
特に変更は必要ないので、このままEnterキーを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/09899f68-d1ca-eafc-c960-8127debe954a.png)

インストールが終わりました。速いのか面倒なのかわかりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/b4af0234-4c62-9858-f658-df9dfa06b458.png)
「FDD1」メニューより、「Eject」でフロッピィディスクを抜き、Enterキーを押しましょう。

再起動すると、MS-DOS Shellが起動してきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/4ca2efee-3639-0f9a-afb3-7c20f2997d26.png)
F12キーを押せば、マウスも使えます(ホスト/仮想のマウス切り替えがF12)

## 4. LSI C-86 Ver.3.30 試食版を展開する
lsic330c.lzhを普通に展開します。
"lsic86"というフォルダにBINフォルダ等が入ってる感じで展開してください。


## 5. DiskExplorerを使ってフロッピィイメージにファイルを転送する
### 1. 空フロッピィイメージの用意
本当は"超遠回り"なので、本来はここでDiskExplorerを使ってHDDイメージ内にファイル転送すれば良いものを、わざわざフロッピィディスクイメージを作って転送してみます。
と言いたいところなのですが、NP21/Wで作ったものがなぜかDOSでフォーマット出来ず、VirtualBoxで作ったimgなフロッピィイメージもそのままでは読めないので、空のイメージを置いておきます。
[Floppy.fdi](https://mikuta0407.net/files/Floppy.fdi)
(確実に自作するには**VirtualBoxの標準機能で作ったフォーマット済みなimg形式のイメージを[Virtual Floppy Image Converter](https://www.vector.co.jp/soft/win95/util/se151106.html)でFDIに変換すればいい**のですが、さすがに記事が長くなるのと、説明が面倒くさいので書きません。)
### 2. フォーマットする
「FDD1」より、↑のFloppy.fdiを開きます。
今までの手順で行っていた場合、Cドライブにフロッピィディスクが入ります。

Shift+F9でDOSのｺﾏﾝﾄﾞﾌﾟﾛﾝﾌﾟﾄを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/738f1a35-5615-5f67-02ea-a1c9b5521462.png)

`format b: `と入力し、実行します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/24ff4b07-6169-34fa-5e8a-91cca6de2c32.png)
挿入してあるのでこのままEnterキーを押します。

フォーマットされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/94bd9337-2189-0931-849e-53d94ad97df0.png)

別に他のイメージはフォーマットしないので、Nで抜けます。
抜けたら、「FDD1」メニューからEjectします。

exitでｺﾏﾝﾄﾞﾌﾟﾛﾝﾌﾟﾄからMS-DOS Shellに戻れます。

### 3. フロッピィイメージ内に書き込む

DiskExplorer(先程ダウンロードしたもの。editdisk.exe)を起動し、今フォーマットしたフロッピィイメージを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/cd2116a4-09be-6110-3823-73ac487d962a.png)
このままOKで開きます。

フロッピィイメージの中を読み書きできるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/8d2c1c70-818a-72de-19e9-b335be3f7a88.png)
ここに、先程展開されたlsic86のフォルダをドラッグアンドドロップで入れます。(フォルダごと入れてください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/e7f5de15-18c6-e38d-2ef2-5d50c339f2eb.png)

書き込んだら、DiskExplorerは閉じ、再びNP21/Wを起動し、FDD1に今のフロッピィイメージを挿入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/9cc7ef4d-1ed6-a2a6-6a40-acf5589b7e1b.png)
ちゃんと認識されていますね

## 6. コンパイラのデータをAドライブ内にコピーする
Shift+F9でｺﾏﾝﾄﾞﾌﾟﾛﾝﾌﾟﾄに入ったら、

```batch:ｺﾏﾝﾄﾞﾌﾟﾛﾝﾌﾟﾄ
mkdir a:\lsic86
xcopy b:\lsic86 a:\lsic86 /e
```
でコピーが出来ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/013bb824-b211-25f5-0731-4218e29a71cb.png)

コピーが終わったら、メニューよりEjectしてください。これをしないと再起動時フロッピィディスクから起動しようとして、MS-DOSが起動しません。

## 7. コンパイラのパスを通すためにAUTOEXEC.BATを編集する

画面下部「ﾒｲﾝ」より、「ﾌｧｲﾙ操作」を開きます。(マウスまたはTabキー+矢印キー+Enterキーで選択)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/5f3a114e-b59f-b491-37b3-184fafd04da5.png)

スクロールし、「ﾃｷｽﾄﾌｧｲﾙの内容変更」を起動します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/47ff7b4b-95df-0e72-d863-d697dbdb4949.png)

どのドライブにあるファイルか聞かれるので、`a:`と入力しEnter/OKします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/055a3678-9b24-ccfb-56ca-3d8bef987e99.png)
どのファイルを編集するか聞かれるので、`autoexec.bat`と入力し、Enter/OKで開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/b805c96d-99d7-7199-4a37-800d41631ed6.png)

テキストエディタが開き、autoexec.batの編集ができるようになったので、追記をしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/ee4fa0d0-30f1-f059-b53f-d0d6362a081e.png)

`SET DOSDIR=A:\DOS`と`A:\DOS\SMARTDRV.EXE /X`の間に、以下を追記します。

```batch:AUTOEXEC.BAT
SET PATH=A:\LSIC86\BIN;%PATH%
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/33cf481b-2e62-bee7-497e-993623915493.png)
追記したら、F1→"E"で保存、終了します

MS-DOS Shellに戻ってきたら、EmulateメニューよりResetで再起動します。

ｺﾏﾝﾄﾞﾌﾟﾛﾝﾌﾟﾄを起動して、`lcc`と入力後、以下の表示になれば、コンパイラのインストール成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/b1bf659c-765c-0469-dee2-9358e5eefd13.png)

## 8. Hello Worldしてみる
さきほどautoexec.batを編集したときと同じ方法で、テキストエディタを起動させ、ファイル名を入力するところで`test.c`と入力してみます。(存在しないファイル名を入力することで新規作成)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/5904306c-cd19-ea73-a584-1f2687d0c816.png)

これで先程のようにテキストエディタが起動しますので、以下のHello World + αなテストコードを書いてみます。

```c:test.c
#include <stdio.h>

int main (){
	int i;
	printf("Hello World\n");
	for (i=1; i<=5; i++){
		printf("%d\n" , i);
	}
	
	return 0;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/e5ae462b-f68c-aa2f-77bf-7770e2f4aab4.png)
(デフォルトだとTabがスペース8文字分になりました)

書き終わったら先程のようにF1→Eで保存します。

Shift+F9でｺﾏﾝﾄﾞﾌﾟﾛﾝﾌﾟﾄに入ったら、
`lcc test.c -o test.exe`
でコンパイルしてみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/a502a908-9b49-ae64-c96c-037fa7fd1bd5.png)
コンパイルされました。

`test.exe`と実行し、きちんと動作してることを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300863/74d5f7e9-bcd4-a05f-f307-029c286a36c8.png)

お疲れさまでした...! ポータブルなC言語開発環境の構築の完成です...!!!
別PCで起動するときは、NP21/WでHDDを再指定するだけで大丈夫です。
動作が動作なのでUSBメモリなどに入れて気軽に持ち歩きましょう!

## あとがき
疲れます。
sudo apt install build-essentialで実質環境構築が済む時代にはあまりに遠回りすぎるので...
でも、こういうの、楽しいよね!
え? 作ったプログラムが64bitなWindowsで動かない? こういう神ソフトを作ってくれてる人がいますよ?
[MS-DOS Player for Win32-x64](http://takeda-toshiya.my.coocan.jp/msdos/)

## あとがき2
アドベントカレンダーというものに今回初参加させていただきました。
よくTwitterに流れてくるアドベントカレンダーはっょぃ人がたくさんいてビビるのですが、今回は身内の多いアドベントカレンダーなので、気軽に参加できました。と思ったら初日から強すぎてハゲそうです。
何を書いてもいいAdvent Calendarなので全力でネタに走ってみました。
今年も残り少なくなってきましたが、皆様体調にはお気をつけください...
14日目にまたお会いしましょう。

次の記事: mak1aさん