Mind8のランタイムディスパッチャC実装の代替実装をC#で行う（完走するのはどのあたりか探る）

# はじめに
[こちらの記事](https://qiita.com/mylifewithviolin/items/8e137cc18b27190d17b8)にてMind開発者の@killyさんよりご提案いただいたMind8の検証用Consoleをベースに一部正規のConsoleのコードを取り込んだ中間コードステップ数84のhellolevel2.mcoの完走をC#で代替実装したディスパッチャで試みています。また、[こちらの記事](https://qiita.com/mylifewithviolin/items/7e505ad649a24e81efd7)では、既に完走させた中間コードステップ数60のhellolevel1.mcoを修正して、本来の順序で処理されるようhellolevel2.mcoの前半部分を追加して中間コードステップ数63のhellolevel3.mco完走させました。本記事ではhellolevel2.mcoの後半部分「私のプログラム名と起動パラメータを設定」の定義内容を分解して、その定義内容の中でどのあたりまで動くのかを探ってみた結果です。

# 前提条件
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

C/C++のデバッガはCで実装されているMind8kernelの動作をデバッグ実行で探るために使用します。[こちらの記事](https://qiita.com/mylifewithviolin/items/2804356ae2f39b055b8c)の環境となります。

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

## ビルド用フォルダ構成
現状は下記のようなフォルダ構成となります。filedummyフォルダは起動検証用Consoleのビルド環境です。fileフォルダは正規のソースファイルが格納されたフォルダです。filelevel4フォルダは本記事のバージョンの格納フォルダです。
filedummyの内容は[こちらの記事](https://qiita.com/mylifewithviolin/items/40772e39e4b44cd27a22)を、filelevel1,2(旧0)の内容は[こちらの記事](https://qiita.com/mylifewithviolin/items/5a68eb63e07379cc7997)を参照してください。

```
C:\developments\vscode\mind8>tree
C:.
├─bin
├─file
│  └─obj
├─filedummy <--完走
│  └─obj
├─filelevel0 <--完走
│  └─obj
├─filelevel1 <--完走
│  └─obj
├─filelevel2 <--未完走
│  └─obj
├─filelevel3 <--完走
│  └─obj
├─filelevel4 <--完走
│  └─obj
├─kernel
│  └─.vscode
├─lib
├─libY
└─sample
```


# お題のMindソースコード
```mind:conslevel4.src
コンソール初期化・基本部とは　　（・  →  ・）
　（しばらくはシステムコールするな）
　　　　終了パラメータを　クリアし　　　　　　　　※CCONST.SRC
　　　　エラー文字列初期化し　　　　　　　　　　　※CERROR.SRC
　　　　空白文字列初期化し　　　　　　　　　　　　※COUTPUT.SRC
	   エラー出力を本来の出力に切り替え　　　　　※COUTPUT.SRC
       私のプログラム名と起動パラメータを設定０し
	。

各ライブラリ初期化とは　　　　　本定義　　　　　（・  →  ・）
　　　　コンソール初期化・基本部し　　　　　　　　　　　※本ソース示すること。
```
$$COLD_FORTHの内容を「各ライブラリ初期化」まで正規版Consoleと同じとして、さらに「各ライブラリ初期化」の中身も「コンソール初期化・基本部」までとし、そしてさらに「コンソール初期化・基本部」の中身を、level3ではlevel2の前半部分の「エラー出力を本来の出力に切り替え」を追加して完走させましたが、今回はlevel2の後半部分の「私のプログラム名と起動パラメータを設定」の定義内容を下記のように大幅削減し、現状で完走する範囲までとしています。

```mind:conslevel4.src
Ｍｉｎｄ文字列に変換して次のアドレスを得る０とは　処理単語  .N　※1999.07.04訂正
　（ASCIZアドレス　→　文字列、次のASCIZアドレス(または0)）
　　　　　　　　アドレス１は　変数
　　　　　　　　バイト位置は　変数		　　※←32bitに(1999.07.04)

　　　　アドレス１に　入れ
。

私のプログラム名と起動パラメータを設定０とは　　（・  → ・）
　　	※※※※※※※※※※※※※※※※※※※※※※※※※
	※　・当モジュール内の$$COLD_FORTHから呼ばれる　※
　　	※　・この中で「私のプログラム名」もセットする　※
　　	※※※※※※※※※※※※※※※※※※※※※※※※※
　　（私のプログラム名を決定）
	c_mcodeFullFilenameを　Ｍｉｎｄ文字列に変換して次のアドレスを得て０
。

```
## 本来のお題のMind8のソースファイル
```mind:hellolevel1.src
メインとは
　　　　「Hello by mind8」を　表示すること。
```
アプリケーションとしてのユーザーコードは上記だけですが、Mind8ランタイムの初期化コードがいろいろな提示済単語をチェック処理していて、現在フルスペックのチェックコードを通過できないため、前記のような初期処理のショートカット版のバージョンを段階的に作成して完走を試みているというのが現状です。

# お題のMind8の中間コード実行リスト
C側検証環境で、お題の中間コードファイルをディスパッチャで処理させます。
```
SqNo mcode mc(dec) mpoint dtp.point  dtp+0   dtp+1 rtp.point  rtp+0  rtp+1
   1 8019  32793    114   1024 1819242324 1442864243   1024        0        0
   2 002F     47    102   1024 1819242324 1442864243   1023 12603162        0
   3 0012     18   8062   1024 1819242324 1442864243   1023 12603162        0
   4 0036     54   8064   1024 1819242324 1442864243   1023 12603162        0
   5 0080    128   8070   1024 1819242324 1442864243   1023 12603162        0
   6 0036     54   8072   1024 1819242324 1442864243   1023 12603162        0
   7 0070    112   8078   1024 1819242324 1442864243   1023 12603162        0
   8 803A  32826   8080   1024 1819242324 1442864243   1023 12603162        0
   9 002F     47    238   1024 1819242324 1442864243   1022 12611128 12603162
  10 80E8  33000   8058   1024 1819242324 1442864243   1022 12611128 12603162
  11 0036     54   8040   1024 1819242324 1442864243   1021 12611106 12611128
  12 0071    113   8046   1024 1819242324 1442864243   1021 12611106 12611128
  13 8046  32838   8048   1024 1819242324 1442864243   1021 12611106 12611128
  14 8045  32837    326   1024 1819242324 1442864243   1020 12611096 12611106
  15 0012     18    314   1024 1819242324 1442864243   1019 12603374 12611096
  16 0036     54    316   1024 1819242324 1442864243   1019 12603374 12611096
  17 0074    116    322   1024 1819242324 1442864243   1019 12603374 12611096
  18 0020     32    324   1024 1819242324 1442864243   1019 12603374 12611096
  19 0020     32    328   1024 1819242324 1442864243   1020 12611096 12611106
  20 80A3  32931   8050   1024 1819242324 1442864243   1021 12611106 12611128
  21 0036     54   3884   1024 1819242324 1442864243   1020 12611098 12611106
  22 0012     18   3890   1024 1819242324 1442864243   1020 12611098 12611106
  23 016E    366   3892   1024 1819242324 1442864243   1020 12611098 12611106
  24 0020     32   3898   1024 1819242324 1442864243   1020 12611098 12611106
  25 808F  32911   8052   1024 1819242324 1442864243   1021 12611106 12611128
  26 0097    151   3626   1024 1819242324 1442864243   1020 12611100 12611106
  27 0065    101   3628   1022        0        2   1020 12611100 12611106
  28 0020     32   3634   1024 1819242324 1442864243   1020 12611100 12611106
  29 80E7  32999   8054   1024 1819242324 1442864243   1021 12611106 12611128
  30 0261    609   8034   1024 1819242324 1442864243   1020 12611102 12611106
  31 80E6  32998   8036   1022        0  4646640   1020 12611102 12611106
  32 001A     26   8026   1022        0  4646640   1019 12611084 12611102
  33 006B    107   8028   1022        0  4646640   1017        0        0
  34 0022     34   8032   1024 1819242324 1442864243   1017  4646640        0
  35 0020     32   8038   1024 1819242324 1442864243   1020 12611102 12611106
  36 0020     32   8056   1024 1819242324 1442864243   1021 12611106 12611128
  37 0020     32   8060   1024 1819242324 1442864243   1022 12611128 12603162
  38 00A5    165   8082   1024 1819242324 1442864243   1023 12603162        0
  39 803C  32828   8106   1022       20 12611132   1023 12603162        0
  40 002F     47    246   1022       20 12611132   1022 12611154 12603162
  41 001A     26   5802   1022       20 12611132   1022 12611154 12603162
  42 006E    110   5804   1022       20 12611132   1020 12611102 12611106
  43 0015     21   5808   1024 1819242324 1442864243   1020       20 12611132
  44 00ED    237   5810   1022        0        1   1020       20 12611132
  45 0022     34   5830   1024 1819242324 1442864243   1020       20 12611132
  46 00A5    165   8108   1024 1819242324 1442864243   1023 12603162        0
  47 00C1    193   8126   1022       14 12611158   1023 12603162        0
$$COLD_FORTH
  48 0020     32   8128   1024 1819242324 1442864243   1023 12603162        0
  49 80F3  33011    116   1024 1819242324 1442864243   1024        0        0
  50 00A5    165   8578   1024 1819242324 1442864243   1023 12603164        0
   0
  60 002F     47    106   1024 1819242324 1442864243   1023 12603166        0
  61 00A5    165   8156   1024 1819242324 1442864243   1023 12603166        0
  62 00C1    193   8170   1022       10 12611206   1023 12603166        0
  実行終り
  63 801B  32795   8172   1024 1819242324 1442864243   1023 12603166        0
  64 002F     47    110   1024 1819242324 1442864243   1022 12611220 12603166
  65 00A5    165   8130   1024 1819242324 1442864243   1022 12611220 12603166
  66 00C1    193   8152   1022       18 12611180   1022 12611220 12603166
  実行終り時の処理
  67 0020     32   8154   1024 1819242324 1442864243   1022 12611220 12603166
  68 0012     18   8174   1024 1819242324 1442864243   1023 12603166        0
  69 004E     78   8176   1024 1819242324 1442864243   1023 12603166        0
  70 0014     20   8182   1022        0        0   1023 12603166        0
```
アドレス値はC#代替互換に変換していないので、少しわかりづらいですが、このバージョンの中間コードステップ数は70であることがわかります。

# お題のMind8の中間コードのC#代替ディスパッチャ実行リスト
C#側検証環境で、お題の中間コードファイルを上記カスタマイズConsoleでビルドしたC#代替ディスパッチャで処理させます。

```
SqNo mcode mc(dec) mpoint dtp.point  dtp+0   dtp+1 rtp.point  rtp+0  rtp+1
   1 8019  32793    114   1024        0        0   1024        0        0
   2 002F     47    102   1024        0        0   1023      114        0
   3 0012     18   8062   1024        0        0   1023      114        0
   4 0036     54   8064   1024        0        0   1023      114        0
   5 0080    128   8070   1024        0        0   1023      114        0
   6 0036     54   8072   1024        0        0   1023      114        0
   7 0070    112   8078   1024        0        0   1023      114        0
   8 803A  32826   8080   1024        0        0   1023      114        0
   9 002F     47    238   1024        0        0   1022     8080      114
  10 80E8  33000   8058   1024        0        0   1022     8080      114
  11 0036     54   8040   1024        0        0   1021     8058     8080
  12 0071    113   8046   1024        0        0   1021     8058     8080
  13 8046  32838   8048   1024        0        0   1021     8058     8080
  14 8045  32837    326   1024        0        0   1020     8048     8058
  15 0012     18    314   1024        0        0   1019      326     8048
  16 0036     54    316   1024        0        0   1019      326     8048
  17 0074    116    322   1024        0        0   1019      326     8048
  18 0020     32    324   1024        0        0   1019      326     8048
  19 0020     32    328   1024        0        0   1020     8048     8058
  20 80A3  32931   8050   1024        0        0   1021     8058     8080
  21 0036     54   3884   1024        0        0   1020     8050     8058
  22 0012     18   3890   1024        0        0   1020     8050     8058
  23 016E    366   3892   1024        0        0   1020     8050     8058
  24 0020     32   3898   1024        0        0   1020     8050     8058
  25 808F  32911   8052   1024        0        0   1021     8058     8080
  26 0097    151   3626   1024        0        0   1020     8052     8058
  27 0065    101   3628   1022        0        2   1020     8052     8058
  28 0020     32   3634   1024        0        0   1020     8052     8058
  29 80E7  32999   8054   1024        0        0   1021     8058     8080
  30 0261    609   8034   1024        0        0   1020     8054     8058
  31 80E6  32998   8036   1022        0  7878112   1020     8054     8058
  32 001A     26   8026   1022        0  7878112   1019     8036     8054
  33 006B    107   8028   1022        0  7878112   1017        0        0
  34 0022     34   8032   1024        0        0   1017  7878112        0
  35 0020     32   8038   1024        0        0   1020     8054     8058
  36 0020     32   8056   1024        0        0   1021     8058     8080
  37 0020     32   8060   1024        0        0   1022     8080      114
  38 00A5    165   8082   1024        0        0   1023      114        0
  39 803C  32828   8106   1022       20     8084   1023      114        0
  40 002F     47    246   1022       20     8084   1022     8106      114
  41 001A     26   5802   1022       20     8084   1022     8106      114
  42 006E    110   5804   1022       20     8084   1020     8054     8058
  43 0015     21   5808   1024        0        0   1020       20     8058
  44 00ED    237   5810   1022        0        1   1020       20     8058
  45 0022     34   5830   1024        0        0   1020       20     8058
  46 00A5    165   8108   1024        0        0   1023      114        0
  47 00C1    193   8126   1022       14     8110   1023      114        0
$$COLD_FORTH
  48 0020     32   8128   1024        0        0   1023      114        0
  49 80F3  33011    116   1024        0        0   1024        0        0
  50 00A5    165   8578   1024        0        0   1023      116        0
  51 8083  32899   8596   1022       14     8580   1023      116        0
  52 0012     18   3510   1022       14     8580   1022     8596      116
  53 004E     78   3512   1022       14     8580   1022     8596      116
  54 00EC    236   3518   1020        0        0   1022     8596      116
  55 0096    150   3524   1022       14     8580   1022     8596      116
  56 026D    621   3526   1020        0        1   1022     8596      116
Hello by mind8
  57 0020     32   3528   1024        0        0   1022     8596      116
  58 0020     32   8598   1024        0        0   1023      116        0
  59 801A  32794    118   1024        0        0   1024        0        0
  60 002F     47    106   1024        0        0   1023      118        0
  61 00A5    165   8156   1024        0        0   1023      118        0
  62 00C1    193   8170   1022       10     8158   1023      118        0
実行終り
  63 801B  32795   8172   1024        0        0   1023      118        0
  64 002F     47    110   1024        0        0   1022     8172      118
  65 00A5    165   8130   1024        0        0   1022     8172      118
  66 00C1    193   8152   1022       18     8132   1022     8172      118
実行終り時の処理
  67 0020     32   8154   1024        0        0   1022     8172      118
  68 0012     18   8174   1024        0        0   1023      118        0
  69 004E     78   8176   1024        0        0   1023      118        0
  70 0014     20   8182   1022        0        0   1023      118        0
例外がスローされました: 'Mind8Kernel.Dispatcher.ExitModule' (mind8dispatch.dll の中)
プログラム '[11372] mind8dispatch.dll' がコード 0 (0x0) で終了しました。
```
とりあえず今回のhellolevel4.mcoの状態であれば完走することがわかりました。

# つづく
生成されたhello.mcoを解釈して、C#側で「Hello by mind8」が出力されるようにするまでの長い道のりですが（初期処理をショートカットすればこの処理自体は処理できていますが、初期処理をどの程度対応するかで道のりの長さは大きく変動しまして、カメの動きとなっております。）、次のレベルの完走を引き続き行ってまいります。