Mind8のランタイムディスパッチャC実装の代替実装をC#で行う（GetArgC）

# はじめに
[こちらの記事](https://qiita.com/mylifewithviolin/items/a6f848995c40d5d5d4f6)にてMind開発者の@killyさんより情報共有いただいたMind8の検証用Consoleをベースに一部正規のConsoleのコードを取り込んだ中間コードステップ数60のhellolevel1.mcoを完走させました。killyさんより別の構成のソースのご提案もいただきましたので、そのバージョンをhellolevel2.mcoとしました。本記事ではこのバージョンの中間コードをC#で代替実装したディスパッチャで処理させてみます。

# 前提条件
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フォルダは正規のソースファイルが格納されたフォルダです。filelevel2フォルダは従来のfilelevel0フォルダです。
filedummyの内容は[こちらの記事](https://qiita.com/mylifewithviolin/items/40772e39e4b44cd27a22)を、filelevel1,2(旧0)の内容は[こちらの記事](https://qiita.com/mylifewithviolin/items/5a68eb63e07379cc7997)を参照してください。今回のお題はfilelevel2内のconslevel2.src上でビルドされたサンプルです。

```
C:\developments\vscode\mind8>tree
C:.
├─bin
├─file
│  └─obj
├─filedummy
│  └─obj
├─filelevel0
│  └─obj
├─filelevel1
│  └─obj
├─filelevel2
│  └─obj
├─kernel
│  └─.vscode
├─lib
├─libY
└─sample
```


# お題のMindソースコード
[こちらの記事](https://qiita.com/mylifewithviolin/items/5a68eb63e07379cc7997)を参照してください。


## お題のMind8のソースファイル
```mind:hellolevel2.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        0        0   1024        0        0
   2 002F     47    102   1024        0        0   1023 12337242        0
   3 0036     54   8036   1024        0        0   1023 12337242        0
   4 0080    128   8042   1024        0        0   1023 12337242        0
   5 0036     54   8044   1024        0        0   1023 12337242        0
   6 0070    112   8050   1024        0        0   1023 12337242        0
   7 803A  32826   8052   1024        0        0   1023 12337242        0
   8 002F     47    238   1024        0        0   1022 12345180 12337242        
   9 80E6  32998   8032   1024        0        0   1022 12345180 12337242        
  10 808F  32911   8026   1024        0        0   1021 12345160 12345180        
  11 0097    151   3626   1024        0        0   1020 12345154 12345160        
  12 0065    101   3628   1022        0        2   1020 12345154 12345160        
  13 0020     32   3634   1024        0        0   1020 12345154 12345160        
  14 80C1  32961   8028   1024        0        0   1021 12345160 12345180        
  15 0261    609   6430   1024        0        0   1020 12345156 12345160        
  16 8053  32851   6432   1022        0  4646640   1020 12345156 12345160        
  17 8052  32850   1042   1022        0  4646640   1019 12343560 12345156
  18 001A     26    950   1022        0  4646640   1018 12338170 12343560        
  19 006B    107    952   1022        0  4646640   1016        0        0        
  20 0055     85    956   1024        0        0   1016  4646640        0        
  21 008F    143    960   1022        0  4646640   1016  4646640        0        
  22 00ED    237    962   1022        0      109   1016  4646640        0        
  23 0055     85    978   1024        0        0   1016  4646640        0        
  24 0012     18    982   1022        0  4646640   1016  4646640        0        
  25 00A2    162    984   1022        0  4646640   1016  4646640        0
  26 00BF    191    990   1020        0 2147483647   1016  4646640        0      
  27 0095    149    992   1022 2147483647  4646640   1016  4646640        0      
  28 01D7    471    994   1020        0        0   1016  4646640        0        
  29 006B    107    996   1022        0       13   1016  4646640        0        
  30 0055     85   1000   1024        0        0   1016  4646640       13        
  31 00ED    237   1004   1022        0       13   1016  4646640       13        
  32 0055     85   1018   1024        0        0   1016  4646640       13        
  33 0055     85   1022   1022        0  4646640   1016  4646640       13
  34 0103    259   1026   1020        0       13   1016  4646640       13        
  35 00BF    191   1028   1020        0       12   1016  4646640       13        
  36 0055     85   1030   1022       12  4646640   1016  4646640       13        
  37 0055     85   1034   1020        0  4646640   1016  4646640       13        
  38 0107    263   1038   1018        0       13   1016  4646640       13        
  39 0022     34   1040   1020        0  4646653   1016  4646640       13        
  40 0122    290   1044   1020        0  4646653   1019 12343560 12345156        
  41 0020     32   1046   1022       12  4646640   1019 12343560 12345156        
  42 0012     18   6434   1022       12  4646640   1020 12345156 12345160
  43 0165    357   6436   1022       12  4646640   1020 12345156 12345160
  44 80C0  32960   6446   1024        0        0   1020 12345156 12345160        
  45 002F     47   6426   1024        0        0   1019 12343574 12345156        
  46 0264    612   6580   1024        0        0   1019 12343574 12345156        
  47 0104    260   6582   1022        0        2   1019 12343574 12345156        
  48 0065    101   6584   1022        0        0   1019 12343574 12345156        
  49 0012     18   6590   1024        0        0   1019 12343574 12345156
  50 0036     54   6592   1024        0        0   1019 12343574 12345156        
  51 0071    113   6598   1024        0        0   1019 12343574 12345156        
  52 0020     32   6600   1024        0        0   1019 12343574 12345156        
  53 0036     54   6448   1024        0        0   1020 12345156 12345160        
  54 0074    116   6454   1024        0        0   1020 12345156 12345160        
  55 0264    612   6456   1024        0        0   1020 12345156 12345160        
  56 0104    260   6458   1022        0        2   1020 12345156 12345160
  57 00EE    238   6460   1022        0        0   1020 12345156 12345160        
  58 0020     32   6578   1024        0        0   1020 12345156 12345160        
  59 0020     32   8030   1024        0        0   1021 12345160 12345180        
  60 0020     32   8034   1024        0        0   1022 12345180 12337242        
  61 00A5    165   8054   1024        0        0   1023 12337242        0        
  62 00C1    193   8072   1022       14 12345184   1023 12337242        0
$$COLD_FORTH
  63 0020     32   8074   1024        0        0   1023 12337242        0        
  64 80F1  33009    116   1024        0        0   1024        0        0        
  65 00A5    165   8530   1024        0        0   1023 12337244        0        
  66 8083  32899   8548   1022       14 12345660   1023 12337244        0        
  67 0012     18   3510   1022       14 12345660   1022 12345676 12337244
  68 004E     78   3512   1022       14 12345660   1022 12345676 12337244        
  69 00EC    236   3518   1020        0        0   1022 12345676 12337244        
  70 0096    150   3524   1022       14 12345660   1022 12345676 12337244        
  71 026D    621   3526   1020        0        1   1022 12345676 12337244        
Hello by mind8  72 0020     32   3528   1024        0        0   1022 12345676 12337244
  73 0020     32   8550   1024        0        0   1023 12337244        0        
  74 801A  32794    118   1024        0        0   1024        0        0
  75 002F     47    106   1024        0        0   1023 12337246        0        
  76 00A5    165   8102   1024        0        0   1023 12337246        0        
  77 00C1    193   8116   1022       10 12345232   1023 12337246        0        
実行終り
  78 801B  32795   8118   1024        0        0   1023 12337246        0        
  79 002F     47    110   1024        0        0   1022 12345246 12337246        
  80 00A5    165   8076   1024        0        0   1022 12345246 12337246        
  81 00C1    193   8098   1022       18 12345206   1022 12345246 12337246
実行終り時の処理
  82 0020     32   8100   1024        0        0   1022 12345246 12337246
  83 004E     78   8120   1024        0        0   1023 12337246        0
  84 0014     20   8126   1022        0        0   1023 12337246        0
PS C:\developments\vscode\mind8\kernel>
```


# お題の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 0036     54   8036   1024        0        0   1023      114        0
   4 0080    128   8042   1024        0        0   1023      114        0
   5 0036     54   8044   1024        0        0   1023      114        0
   6 0070    112   8050   1024        0        0   1023      114        0
   7 803A  32826   8052   1024        0        0   1023      114        0
   8 002F     47    238   1024        0        0   1022     8052      114
   9 80E6  32998   8032   1024        0        0   1022     8052      114
  10 808F  32911   8026   1024        0        0   1021     8032     8052
  11 0097    151   3626   1024        0        0   1020     8026     8032
  12 0065    101   3628   1022        0        2   1020     8026     8032
  13 0020     32   3634   1024        0        0   1020     8026     8032
  14 80C1  32961   8028   1024        0        0   1021     8032     8052
  15 0261    609   6430   1024        0        0   1020     8028     8032
  16 8053  32851   6432   1022        0  5376768   1020     8028     8032
  17 8052  32850   1042   1022        0  5376768   1019     6432     8028
  18 001A     26    950   1022        0  5376768   1018     1042     6432
  19 006B    107    952   1022        0  5376768   1016        0        0
  20 0055     85    956   1024        0        0   1016  5376768        0
  21 008F    143    960   1022        0  5376768   1016  5376768        0
  22 00ED    237    962   1022        0  5376768   1016  5376768        0
  23 0055     85    978   1024        0        0   1016  5376768        0
  24 0012     18    982   1022        0  5376768   1016  5376768        0
  25 00A2    162    984   1022        0  5376768   1016  5376768        0
  26 00BF    191    990   1020        0    65535   1016  5376768        0
  27 0095    149    992   1022    65535  5376768   1016  5376768        0
  28 01D7    471    994   1020        0        0   1016  5376768        0
  29 006B    107    996   1022        0        1   1016  5376768        0
  30 0055     85   1000   1024        0        0   1016  5376768        0
  31 00ED    237   1004   1022        0        1   1016  5376768        0
  32 0055     85   1018   1024        0        0   1016  5376768        0
  33 0055     85   1022   1022        0  5376768   1016  5376768        0
  34 0103    259   1026   1020        0        1   1016  5376768        0
  35 00BF    191   1028   1020        0        1   1016  5376768        0
  36 0055     85   1030   1022        1  5376768   1016  5376768        0
  37 0055     85   1034   1020        0  5376768   1016  5376768        0
  38 0107    263   1038   1018        0        1   1016  5376768        0
  39 0022     34   1040   1020        0  5376769   1016  5376768        0
  40 0122    290   1044   1020        0  5376769   1019     6432        1
  41 0020     32   1046   1022        1  5376768   1019     6432        1
  42 0012     18   6434   1022        1  5376768   1020        1     8032
  43 0165    357   6436   1022        1  5376768   1020        1     8032
  44 80C0  32960   6446   1024        0        0   1020        1     8032
  45 002F     47   6426   1024        0        0   1019     6446        1
  46 0264    612   6580   1024        0        0   1019     6446        1
  47 0104    260   6582   1022        0   826464   1019     6446        1
  48 0065    101   6584   1022   826462   826464   1019     6446        1
  49 0012     18   6590   1024        0        0   1019     6446        1
  50 0036     54   6592   1024        0        0   1019     6446        1
  51 0071    113   6598   1024        0        0   1019     6446        1
  52 0020     32   6600   1024        0        0   1019     6446        1
  53 0036     54   6448   1024        0        0   1020        1     8032
  54 0074    116   6454   1024        0        0   1020        1     8032
  55 0264    612   6456   1024        0        0   1020        1     8032
  56 0104    260   6458   1022        0   826112   1020        1     8032
  57 00EE    238   6460   1022   826110   826112   1020        1     8032
例外がスローされました: 'System.NullReferenceException' (mind8dispatch.dll の中)
プログラム '[6536] mind8dispatch.dll' がコード -1 (0xffffffff) で終了しました。
```

最後が例外スローされていますが、これはmcode= 00EEがまだ実装されていないことによるものです。この実行結果に至る途中、ステップ46のmcode= 0264も未実装でしたので、今回下記のように実装しています。


# お題のC#ソースコード
```cs:CsFunctions3ker.cs
using System.Runtime.InteropServices;
using System.Text;

namespace Mind8Kernel
{
    public partial class Dispatcher
    {
        private void GetArgC()		/* ;WORD ａｒｇｃ */
        {
            /* Mコード=0x0264 */
            /* (. →　argc) */
            //PUSH_Q( Argc, 0 );
            IntPtr ptr =Marshal.StringToHGlobalAnsi(argc);
            dtp.PushUl((uint)ptr);//暫定
            dtp.PushUl(0);
        }
```        
# つづく
生成されたhello.mcoを解釈して、C#側で「Hello by mind8」が出力されるようにするまでの長い道のりですが（初期処理をショートカットすればこの処理自体は処理できていますが、初期処理をどの程度対応するかで道のりの長さは大きく変動しまして、カメの動きとなっております。）、次のレベルの完走を引き続き行ってまいります。