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

# はじめに
[こちらの記事](https://qiita.com/mylifewithviolin/items/44b24457147cd078e8ce)にてMind開発者の@killyさんよりご提案いただいたMind8の検証用Consoleをベースに一部正規のConsoleのコードを取り込んだ中間コードステップ数84の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側検証環境で、お題の中間コードファイルをディスパッチャで処理させます。
[こちらの記事](https://qiita.com/mylifewithviolin/items/44b24457147cd078e8ce)を参照してください。

# お題の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  4405280   1020     8028     8032
  17 8052  32850   1042   1022        0  4405280   1019     6432     8028
  18 001A     26    950   1022        0  4405280   1018     1042     6432
  19 006B    107    952   1022        0  4405280   1016        0        0
  20 0055     85    956   1024        0        0   1016  4405280        0
  21 008F    143    960   1022        0  4405280   1016  4405280        0
  22 00ED    237    962   1022        0  4405280   1016  4405280        0
  23 0055     85    978   1024        0        0   1016  4405280        0
  24 0012     18    982   1022        0  4405280   1016  4405280        0
  25 00A2    162    984   1022        0  4405280   1016  4405280        0
  26 00BF    191    990   1020        0    65535   1016  4405280        0
  27 0095    149    992   1022    65535  4405280   1016  4405280        0
  28 01D7    471    994   1020        0        0   1016  4405280        0
  29 006B    107    996   1022        0        1   1016  4405280        0
  30 0055     85   1000   1024        0        0   1016  4405280        0
  31 00ED    237   1004   1022        0        1   1016  4405280        0
  32 0055     85   1018   1024        0        0   1016  4405280        0
  33 0055     85   1022   1022        0  4405280   1016  4405280        0
  34 0103    259   1026   1020        0        1   1016  4405280        0
  35 00BF    191   1028   1020        0        1   1016  4405280        0
  36 0055     85   1030   1022        1  4405280   1016  4405280        0
  37 0055     85   1034   1020        0  4405280   1016  4405280        0
  38 0107    263   1038   1018        0        1   1016  4405280        0
  39 0022     34   1040   1020        0  4405281   1016  4405280        0
  40 0122    290   1044   1020        0  4405281   1019     6432        1
  41 0020     32   1046   1022        1  4405280   1019     6432        1
  42 0012     18   6434   1022        1  4405280   1020        1     8032
  43 0165    357   6436   1022        1  4405280   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 1260624832   1019     6446        1
  48 0065    101   6584   1022 1260624830 1260624832   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 1260625280   1020        1     8032
  57 00EE    238   6460   1022 1260625278 1260625280   1020        1     8032
  58 0020     32   6578   1024        0        0   1020        1     8032
  59 0000      0      3   1024        0        0   1021     8032     8052
例外がスローされました: 'System.NullReferenceException' (mind8dispatch.dll の中)

```

前回ステップ57のmcode= 00EEが未実装でしたので、今回下記のように実装しています。if ( !count )  のヶ所はif(count!=1)と実装することで、次のステップのmcodeの値がCオリジナルと同じ値となりました。（真？の側に進行します。）
しかし、ステップ58のmcode= 0020の実行結果が現在オリジナルと異なってしまい、ステップ59のmcodeの値が不正となってしまっています。（本来ステップ59もmcode= 0020となる）
mcode= 0020の実装自体はほぼほぼ適合しているので、リターンスタックの状態ずれが起因として次に処理するmcodeの値が変わってしまっています。

# お題のC#ソースコード
```cs:CsFunctionsBunki.cs
namespace Mind8Kernel
{
    public partial class Dispatcher
    {
      /*------------------- 回数指定～繰り返し  ------------------------*/
        private void ZzDo(){   /* ;WORD $$DO */
                    /* Mコード=0x00ED */
            //         ULONG   count;
            // count = POP_L_OF_Q;                     /* カウントをpopする */
            // if ( !count )                           /* カウント=0 ? */
            // {
            //         SKIP_MCODE( READ_MCODE_SHORT ); /* $$LOOPの次の位置に飛ぶ */
            // }
            // else
            // {
            //         PUSH_R( count );                /* カウントを積む(long) */
            //         PUSH_R( 1 );                    /* 初期値(1)を積む(long) */
            //         SKIP_MCODE_1WORD;               /* $$LOOPへの飛び先をskip */
            // }
            dtp.PopUl();//≒DROP Dataスタックから取り出して捨てる 
            uint count=dtp.PopUl();       
            if(count!=1){
                //mp.MoveMcodeIndexByByte(mp.ReadMcodeShort());
                short mc=mp.ReadMcodeShort();
                mp.MoveMcodeIndexByByte(mc);
            }else{
                dtp.PushUl(count);
                dtp.PushUl(0);
                mp.MoveMcodeIndex(1);
            }
        }

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