日本語プログラミング言語Mind8のCランタイム起動検証用Consoleと正規版Consoleの間のカスタマイズビルド方法


[こちらの記事](https://qiita.com/mylifewithviolin/items/671c6da53f59eb4b8993)にてMind開発者の@killyさんより情報共有いただいたMind8のCランタイムディスパッチャ起動検証用Consoleでリビルドした中間コードhellodummy.mcoを使ってC#代替実装版はいったん完走の日の目を見ることができました。そして、引き続き[前回記事](https://qiita.com/mylifewithviolin/items/2a652d2ca8fbfcf38d30)にて正規版のConsoleでビルドした中間コードhello.mcoに対する処理の続きを行ってみたのですが、やはり処理しなければならないmcodeの数の多さにくらくらしてしまいました。(正規版は終了までのmcode数は694、起動検証用では20)

そこで本記事では正規版の694と、起動検証用の20との間狙いで、段階的に終了までの検証ステップ数を増やしていくようなカスタムビルドができないものか、検討検証してみました。

# 前提条件
Windows11 Pro 22H2
VSCode(Visual Studo Code)　1.86.1
Microsoft Visual C++ 2008 Express Edition
Mind Version 8.0.08 for Windows
C# 12 
dotnet-sdk-8.0.204-win-x64

## VSCodeの拡張機能
C/C++ for Visual Studio Code 1.18.5 Microsoft 
C/C++ Extension Pack 1.3.0 Microsoft 
.NET Install Tool 2.0.2 Microsoft
Base language support for C# 2.18.16 Microsoft

### 2つのVSCode環境
ちょっと紛らわしいのですが、本記事に関連しては2つのVSCode環境がございます。
お手数ですが、検証用Consoleをビルドした際の[こちらの記事](https://qiita.com/mylifewithviolin/items/40772e39e4b44cd27a22)もご参照ください。

### 2つのVSCode環境を使った本記事作業のおおまかな流れ
本記事ではMind8のCランタイムディスパッチャConsoleのカスタマイズビルド環境として1つめを使います。こちらはランタイムのカスタマイズ環境としてMind8のランタイムソースが具備されています。

そして、ビルドされたカスタマイズConsoleを使って、C#代替実装検証用の中間コードhello.mcoを2つめの環境でビルドします。今回はhellolevel1とします。

そしてさらに、このカスタマイズConsoleでリビルドされたC#代替実装検証用の中間コードhellolevel1.mcoを1つめの環境にコピーして、カスタマイズ短縮されたスタートアップでのディスパッチャの動きを確認します。

# カスタマイズConsoleのビルド
killyさんよりご提供いただいた情報に従い、下記のようにカスタマイズConsoleのビルド用のフォルダfilelevel1を作成します。

## ビルド用フォルダ構成
filedummyフォルダは起動検証用Consoleのビルド環境です。今回はそれと併存してfilelevel1フォルダを作成します。fileフォルダは正規のソースファイルが格納されたフォルダです。今回はこちらのソースも参照します。
```
C:\developments\vscode\mind8>tree
C:.
├─bin
├─file
│  └─obj
├─filedummy
│  └─obj
├─filelevel1
│  └─obj
├─kernel
│  └─.vscode
├─lib
├─libY
└─sample
```
fileleve1lフォルダには下記のようなファイルを格納します。
conslevel1.srcはfileフォルダよりコピーしたconsdumy.srcを編集します。asmword.*はfile/objフォルダよりコピーします。batファイルは新規作成です。リビルド用バッチは割愛しています。

```
C:\developments\vscode\mind8\filelevel1>tree /f
C:.
│  cconlv10.bat
│  conslevel1.src
│
└─obj
        asmword.his
        asmword.mco
        asmword.sym
```
# お題のMindソースコード

カスタマイズConsoleのconslevel1.srcを起動検証用Consoleのconsdumy.srcに対して正規版ConsoleのConsole.srcから必要部分だけもってきて、下記のように編集します。
```mind:conslevel1.src
スプーリングアドレスは　　変数。
入力文字補正アドレスは　　変数。
※検索機能初期化アドレスは　変数。
※検索機能終了アドレスは　　変数。

　　　　グローバル。

"../file/osdefine.src"を　　コンパイルする。　　    （DOS/UNIXの指定）
"../file/cswitch.src"を 　　コンパイルする。　　　　（コンパイルスイッチ）
"../file/ckaridef.src"を　　コンパイルする。　　　　（仮定義）
"../file/cconvar.src"を　　コンパイルする。　　　　（大域定数／大域変数）
"../file/cerrmsg.src"を 　　コンパイルする。　　　　（エラー定数／エラー登録）
"../file/cconv.src"を     　コンパイルする。　　　　（数値／文字列変換）
"../file/coutput.src"を　　 コンパイルする。　　　　（Ｐｕｒｅな表示系）
"../file/cerror.src"を　　　コンパイルする。　　　　（エラー処理）

　　　　ローカル。

立ち上がり要求は　　　　ワード変数。
立ち下がり要求は　　　　ワード変数。

コンソール初期化・基本部とは　　（・  →  ・）
　（しばらくはシステムコールするな）
　　　　終了パラメータを　クリアし　　　　　　　　※CCONST.SRC
　　　　エラー文字列初期化し　　　　　　　　　　　※CERROR.SRC
　　　　空白文字列初期化し　　　　　　　　　　　　※COUTPUT.SRC
	。

各ライブラリ初期化とは　　　　　本定義　　　　　（・  →  ・）
　　　　コンソール初期化・基本部し　　　　　　　　　　　※本ソース
	。

　　　　グローバル。

$$COLD_FORTHは 　　 　　本定義
　（プログラム起動時のみの処理）
　　　　立ち上がり要求を　セットし
　　　　立ち下がり要求を　クリアし
　（ライブラリ初期化処理）
　　　　各ライブラリ初期化し　　　　　　　　　　　　　　※本ソース
　　　　「各ライブラリ初期化後」で　このメッセージでスタック検査し
　　　　「$$COLD_FORTH＆改行＆」を　＄＄表示。

実行終り時の処理は　　　本定義
　　　　「実行終り時の処理＆改行＆」を　＄＄表示すること。

実行終りは　　　　　　　本定義
　　　　「実行終り＆改行＆」を　＄＄表示し
　　　　実行終り時の処理し
　　　　終了パラメータで　プロセス終り０。

？　$$SLITERAL_EVEN。
？　$$SLITERAL_ODD。
？　$$JMP_NEAR。
？　$$JMP_FAR0。
？　$$EXIT1W。
？　$$COLD_FORTH。
？　$$COLD_USER。
？　＄＄対話モード？。
？　$$TRAP2_ENTRY。
？　プロセス終り０。
？　実行終り時の処理。
？　実行終り。
？　＄＄表示。
？　＄＄改行。


※改ページ

$$HOT3は　　　　　　　　本定義　　　　　（ZERO DIVIDE ERROR）
　　　　「ゼロで除算しました。」で　重大エラー。

$$HOT4は　　　　　　　　本定義　　　　　（INDEX OVERFLOW）
（次のMコードロケ、配列先頭ロケ、異常番号(32)、全要素数(16)、種別(16) → ・）
　　　　　　　　次のＭコードロケーションは　変数
　　　　　　　　配列先頭ロケーションは　　　変数
　　　　　　　　異常番号は　　　　　　　　　変数
　　　　　　　　全要素数は　　　　　　ワード変数
　　　　　　　　種別は　　　　　　　　ワード変数
　　　　次のＭコードロケーションと　配列先頭ロケーションと
　　　　　異常番号と　全要素数と　種別に　入れ
　　　　「要素番号が異常です。＆０Ｄ０Ａ＆」を　＄＄表示し
　　　　「次のMコードロケーション=」を　＄＄表示し
　　　　　　　　次のＭコードロケーションを　＄＄ダブル表示し　＄＄改行し
　　　　「配列先頭ロケーション =」を　＄＄表示し
　　　　　　　　配列先頭ロケーションを　　　＄＄ダブル表示し　＄＄改行し
　　　　「配列種別=」を　＄＄表示し
　　　　　　　　種別を　　　　　　　　　　　＄＄ニブル表示し
　　　　「　異常要素番号=」を　＄＄表示し
　　　　　　　　異常番号を　　　　　　　　　＄＄ダブル表示し
　　　　「　有効要素数=」を　＄＄表示し
　　　　　　　　全要素数を　　　　　　　　　＄＄ワード表示し
　　　　「」で　重大エラー。

$$HOT5は　　　　　　　　本定義　　　　　（先行入力文字積み）
　　　　「$$HOT5(先行入力要求)=」を　$$表示し
　　　　$$ワード表示し　$$改行。

$$HOT6は　　　　　　　　本定義　　　　　（ブレーク処理）
　　　　「$$HOT6(ブレーク検査要求)=」を　$$表示し
　　　　$$ワード表示し　$$改行。

$$HOT16は　　　　　　　 本定義　　　　　（NOT_NUMBER_ERROR）
　　　　「数値でないデータを与えました。」で　重大エラー。

$$HOT17は　　　　　　　 本定義　　　　　（NOT_STRING_ERROR）
　　　　「文字列でないデータを与えました。」で　重大エラー。


※　終り(CONSDUMY.SRC)　※
```

$$COLD_FORTHの内容を「各ライブラリ初期化」まで正規版Consoleと同じとして、さらに「各ライブラリ初期化」の中身も「コンソール初期化・基本部」までとし、そしてさらに「コンソール初期化・基本部」の中身も「空白文字列初期化し」までとして、正規版の実装から各所後半を大幅にカットしています。

サブソースはファイル名にfileフォルダへの相対パス情報を追記しています。また正規版のConsoleより一部カットしています。

## ビルド実行
ビルドの実行はcconlv10.batを実行します。
```:cconlv10.bat
@mind conslevel1.src obj\asmword  obj\ -local
```
Mind8コンパイラへのパスは通しておきます。
```
C:\developments\vscode\mind8>c:\pmind\usemind
myfolder=pmind\
myfolder=pmind
newpath=[]
Mindの開発環境を設定しました。

c:\pmind>cd c:\developments\vscode\mind8\filelevel1
c:\developments\vscode\mind8\filelevel1>cconlv10.bat

日本語プログラミング言語 Ｍｉｎｄ Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 ..「$$SLITERAL_EVEN」：
　　【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 ASM ..  送り検=無し
　　ロケーション=00000000 インデックス=00A5 式演算番号=0
「$$SLITERAL_ODD」：
　　【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 ASM ..  送り検=無し
　　ロケーション=00000000 インデックス=00A4 式演算番号=0
「$$JMP_NEAR」：
　　【雑単語の未定義語】module=0 (データ型不使用) 値=00000000
「$$JMP_FAR0」：
　　【雑単語の未定義語】module=0 (データ型不使用) 値=00000000
「$$EXIT1W」：
　　【雑単語の未定義語】module=0 (データ型不使用) 値=00000000
「$$COLD_FORTH」：
　　【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 仮定義 .. 送り検=無し 
　　ロケーション=00000064 インデックス=0019 式演算番号=0
「$$COLD_USER」：
　　【雑単語の未定義語】module=0 (データ型不使用) 値=00000000
「＄＄対話モード？」：
　　【雑単語の未定義語】module=0 (データ型不使用) 値=00000000
「$$TRAP2_ENTRY」：
　　【雑単語の未定義語】module=0 (データ型不使用) 値=00000000 
「プロセス終り０」：
　　【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 ASM .. 
送り検=無し
　　ロケーション=00000000 インデックス=0014 式演算番号=0
「実行終り時の処理」：
　　【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 仮定義 .. 送り検=無し
　　ロケーション=0000006C インデックス=001B 式演算番号=0
「実行終り」：
　　【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 仮定義 .. 送り検=無し
　　ロケーション=00000068 インデックス=001A 式演算番号=0
「＄＄表示」：
　　【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 ASM ..  送り検=無し
　　ロケーション=00000000 インデックス=00C1 式演算番号=0 
「＄＄改行」：
　　【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 ASM ..  送り検=無し
　　ロケーション=00000000 インデックス=00C4 式演算番号=0
 終了

```

conslevel1のオブジェクトライブラリファイルが生成されていることを確認します。
```
c:\developments\vscode\mind8\filelevel1>dir obj\conslevel1.* 
2024/05/19  17:47               760 conslevel1.his
2024/05/19  17:47             7,994 conslevel1.mco
2024/05/19  17:47            24,064 conslevel1.sym
               3 個のファイル              32,818 バイト```
```

ここまででMind8のCランタイムディスパッチャのカスタマイズ版Consoleのビルドは完了です。

# カスタマイズ版Consoleライブラリを使った中間コードのリビルド
正規のスタートアップルーチンを起動する中間コードファイルと区別するため、ソースコードファイル名を下記のように変更します。
hello.src → hellolevel1.src

```
C:\developments\vscode\mind8dispatch>dir *.src
2024/04/18  20:49                56 hello.src
2024/05/12  13:06                60 hellodummy.src
2024/05/19  15:24                56 hellolevel1.src
               3 個のファイル                 172 バイト
```               
## お題のMind8のソースファイル
```mind:hellolevel1.src
メインとは
　　　　「Hello by mind8」を　表示すること。
```
## ビルド実行
横スクロールしてわかりずらいですが、こちらはC#用環境のため、Mind8コンパイラのライブラリ指定パスにはさきほどのC用環境の上にあるfilelevel1\objフォルダのconslevel1を指定します。
```
C:\developments\vscode\mind8dispatch>mind hellolevel1 c:\developments\vscode\mind8\filelevel1\obj\conslevel1     

日本語プログラミング言語 Ｍｉｎｄ Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> hellolevel1.exe
```
無事に新しい中間コードファイルhellolevel1.mcoファイルも生成されています。
起動検証用Consoleのhellodummy.mcoのサイズのおよそ9倍という状態のようです。それでも正規版のサイズに対しては1/5より小さいです。
```
C:\developments\vscode\mind8dispatch>dir hello*.mco
2024/04/18  20:53            43,544 hello.mco
2024/05/12  13:06               938 hellodummy.mco
2024/05/19  15:37             8,034 hellolevel1.mco
               3 個のファイル              52,516 バイト
```
C側検証環境でhellolevel1.mcoでのスタートアップ処理を検証するため、hellolevel1.mcoをmindexec.mcoにリネームしてC側検証環境のkernelフォルダにコピーします。
```
C:\developments\vscode\mind8dispatch>copy hellolevel1.mco C:\developments\vscode\mind8\kernel\mindexec.mco
C:\developments\vscode\mind8\kernel\mindexec.mco を上書きしますか? (Yes/No/All):
 Y
        1 個のファイルをコピーしました。
```

# お題のMind8の中間コード実行リスト
C側検証環境で、前記手順でコピーしたお題の中間コードファイルをディスパッチャで処理させます。
```
SqNo mcode mc(dec) mpoint dtp.point  dtp+0   dtp+1 rtp.point  rtp+0  rtp+1
   1 8019  32793     57   1024        0        0   1024        0        0
   2 002F     47     51   1024        0        0   1023        0        0
   3 0012     18   2931   1024        0        0   1023        0        0
   4 0036     54   2932   1024        0        0   1023        0        0
   5 0080    128   2935   1024        0        0   1023        0        0
   6 0036     54   2936   1024        0        0   1023        0        0
   7 0070    112   2939   1024        0        0   1023        0        0
   8 803A  32826   2940   1024        0        0   1023        0        0
   9 002F     47    119   1024        0        0   1022        0 13385794
  10 80B8  32952   2929   1024        0        0   1022        0 13385794
  11 0012     18   2921   1024        0        0   1021        0 13391560
  12 0036     54   2922   1024        0        0   1021        0 13391560
  13 0071    113   2925   1024        0        0   1021        0 13391560
  14 8046  32838   2926   1024        0        0   1021        0 13391560
  15 8045  32837    163   1024        0        0   1020        0 13391538
  16 0012     18    157   1024        0        0   1019        0 13391532
  17 0036     54    158   1024        0        0   1019        0 13391532
  18 0074    116    161   1024        0        0   1019        0 13391532
  19 0020     32    162   1024        0        0   1019        0 13391532
  20 0020     32    164   1024        0        0   1020        0 13391538
  21 80A3  32931   2927   1024        0        0   1021        0 13391560
  22 0036     54   1942   1024        0        0   1020        0 13391538
  23 0012     18   1945   1024        0        0   1020        0 13391538
  24 016E    366   1946   1024        0        0   1020        0 13391538
  25 0020     32   1949   1024        0        0   1020        0 13391538
  26 0020     32   2928   1024        0        0   1021        0 13391560
  27 0020     32   2930   1024        0        0   1022        0 13385794
  28 00A5    165   2941   1024        0        0   1023        0        0
  29 803C  32828   2953   1022       20 13391564   1023       20        0
  30 002F     47    123   1022       20 13391564   1022       20 13385794
  31 001A     26   2901   1022       20 13391564   1022       20 13385794
  32 006E    110   2902   1022       20 13391564   1020       20 13391538
  33 0015     21   2904   1024        0        0   1020        0 13391564
  34 00ED    237   2905   1022        0        1   1020        0 13391564
  35 0022     34   2915   1024        0        0   1020        0 13391564
  36 00A5    165   2954   1024        0        0   1023        0        0
  37 00C1    193   2963   1022       14 13391590   1023       14        0
$$COLD_FORTH
  38 0020     32   2964   1024        0        0   1023        0        0
  39 80C3  32963     58   1024        0        0   1024        0        0
  40 00A5    165   3193   1024        0        0   1023        0        0
  41 8083  32899   3202   1022       14 13392068   1023       14        0
  42 0012     18   1755   1022       14 13392068   1022       14 13385796
  43 004E     78   1756   1022       14 13392068   1022       14 13385796
  44 00EC    236   1759   1020        0        0   1022        0 13385796
  45 0096    150   1762   1022       14 13392068   1022       14 13385796
  46 026D    621   1763   1020        0        1   1022        0 13385796
Hello by mind8  47 0020     32   1764   1024        0        0   1022        0 13385796
  48 0020     32   3203   1024        0        0   1023        0        0
  49 801A  32794     59   1024        0        0   1024        0        0
  50 002F     47     53   1024        0        0   1023        0        0
  51 00A5    165   2978   1024        0        0   1023        0        0
  52 00C1    193   2985   1022       10 13391638   1023       10        0
実行終り
  53 801B  32795   2986   1024        0        0   1023        0        0
  54 002F     47     55   1024        0        0   1022        0 13385798
  55 00A5    165   2965   1024        0        0   1022        0 13385798
  56 00C1    193   2976   1022       18 13391612   1022       18 13385798
実行終り時の処理
  57 0020     32   2977   1024        0        0   1022        0 13385798
  58 0012     18   2987   1024        0        0   1023        0        0
  59 004E     78   2988   1024        0        0   1023        0        0
  60 0014     20   2991   1022        0        0   1023        0        0
```
お題の「Hello by mind8」のコンソール出力までは46（同一コード含む）のmcodeを処理すればよいことがわかりました！！終了までは60ステップです。:confetti_ball:

# つづく
正規版Consoleの中間コードではステップ56くらいまでは進行しており、お題のコンソール出力後の終了処理は起動検証用Consoleの中間コードで完走していますので、もしかしたらこの状態の場合は現状でも完走するかもしれません。