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

# はじめに
[こちらの記事](https://qiita.com/mylifewithviolin/items/40772e39e4b44cd27a22)にてMind開発者の@killyさんより情報共有いただいたMind8のCランタイムディスパッチャ起動検証用Consoleでリビルドした中間コードhellodummy.mcoをリビルドし[前回記事](https://qiita.com/mylifewithviolin/items/671c6da53f59eb4b8993)ではそちらの中間コードを使ってC#代替実装版はいったん完走の日の目を見ることができました。

本記事はその続きではありますが、いったん標準版のConsoleでビルドした中間コードhello.mcoに対する処理の[こちらの記事](https://qiita.com/mylifewithviolin/items/37d0af60ef8dc0b8a8a1)からの続きとなります。


# 前提条件
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)の環境となります。

# お題のMind8の中間コードファイル
[こちらの記事](https://qiita.com/mylifewithviolin/items/7f0878469e068baccf90)をご参照ください。また、[こちらの記事](https://qiita.com/mylifewithviolin/items/c24cac3a0788cc2ad6f5)に実際のMCode領域内のMCodeをC版オリジナルがディスパッチしたリストを確認しています。お題の「Hello by mind8」のコンソール出力までは649（同一コード含む）のmcodeを処理します。

# とりあえずどんな状況か
前回記事は54ステップ目で未実装関数の出現でとまっていましたが、現状は下記のとおりです。
```
SqNo mcode mc(dec) mindex dtp.index  dtp+1   dtp+2 rtp.index  rtp+1  rtp+2
   1 8019  32793    114   1024        0        0   1024        0        0
   2 002F     47    102   1024        0        0   1023      114        0
   3 0036     54  12168   1024        0        0   1023      114        0
   4 0080    128  12174   1024        0        0   1023      114        0
   5 0036     54  12176   1024        0        0   1023      114        0
   6 0070    112  12182   1024        0        0   1023      114        0
   7 803A  32826  12184   1024        0        0   1023      114        0
   8 002F     47    238   1024        0        0   1022    12184        0
   9 813E  33086  12086   1024        0        0   1022    12184        0
  10 0012     18  12058   1024        0        0   1021    12086        0
  11 0036     54  12060   1024        0        0   1021    12086        0
  12 0071    113  12066   1024        0        0   1021    12086        0
  13 8046  32838  12068   1024        0        0   1021    12086        0
  14 8045  32837    326   1024        0        0   1020    12068        0
  15 0012     18    314   1024        0        0   1019      326        0
  16 0036     54    316   1024        0        0   1019      326        0
  17 0074    116    322   1024        0        0   1019      326        0
  18 0020     32    324   1024        0        0   1019      326        0
  19 0020     32    328   1024        0        0   1020    12068      326
  20 80BA  32954  12070   1024        0        0   1021    12086    12068
  21 0036     54   6176   1024        0        0   1020    12070      326
  22 0012     18   6182   1024        0        0   1020    12070      326
  23 016E    366   6184   1024        0        0   1020    12070      326
  24 0020     32   6190   1024        0        0   1020    12070      326
  25 80A6  32934  12072   1024        0        0   1021    12086    12070
  26 0097    151   5918   1024        0        0   1020    12072      326
  27 0065    101   5920   1022        0        0   1020    12072      326
  28 0020     32   5926   1024        0        2   1020    12072      326
  29 80D7  32983  12074   1024        0        2   1021    12086    12072
  30 0261    609   8458   1024        0        2   1020    12074      326
  31 8053  32851   8460   1022        0        0   1020    12074      326
  32 8052  32850   1042   1022        0        0   1019     8460        0
  33 001A     26    950   1022        0        0   1018     1042        0
  34 006B    107    952   1022        0        0   1016    12074     8460
  35 0055     85    956   1024        0  7294000   1016    12074     8460
  36 008F    143    960   1022        0        0   1016    12074     8460
  37 00ED    237    962   1022        0        0   1016    12074     8460
  38 0055     85    978   1024        0  7294000   1016    12074     8460
  39 0012     18    982   1022        0        0   1016    12074     8460
  40 00A2    162    984   1022        0        0   1016    12074     8460
  41 00BF    191    990   1020        0        0   1016    12074     8460
  42 0095    149    992   1022    65535    65535   1016    12074     8460
  43 01D7    471    994   1020        0        0   1016    12074     8460
  44 006B    107    996   1022        0        0   1016    12074     8460
  45 0055     85   1000   1024        0        1   1016    12074     8460
  46 00ED    237   1004   1022        0        0   1016    12074     8460
  47 0055     85   1018   1024        0        1   1016    12074     8460
  48 0055     85   1022   1022        0        0   1016    12074     8460
  49 0103    259   1026   1020        0        0   1016    12074     8460
  50 00BF    191   1028   1020 4294967295        0   1016    12074     8460
  51 0055     85   1030   1022        1        1   1016    12074     8460
  52 0055     85   1034   1020        0        0   1016    12074     8460
  53 0107    263   1038   1018        0        0   1016    12074     8460
  54 0022     34   1040   1020        2        1   1016    12074     8460
  55 0122    290   1044   1020        2        1   1019        0        0
  56 0020     32   1046   1022        0        0   1019        0        0
  57 0020     32      2   1022        0        0   1020     1042        0
  58 0122    290   1044   1022        0        0   1021     8460     1042
  59 0020     32   1046   1024        0        0   1021     8460     1042
  60 0012     18   8462   1024        0        0   1022    12074     8460
  61 0165    357   8464   1024        0        0   1022    12074     8460
例外がスローされました: 'System.NullReferenceException' (mind8dispatch.dll の中)
プログラム '[15348] mind8dispatch.dll' がコード -1 (0xffffffff) で終了しました。

```
61ステップ目のmcode=0165が未実装のため落ちていますが、その少し手前の57ステップ目も異常値でmcodeの読み込み位置（mcodeのindexが本来値と異なる値となってしまい、以降の処理が不正となっています。このため、本記事ではmcode=0165の実装は行っていません。

# お題のC#ソースコード
前回記事から修正・追加した関数は下記のとおりです。

## Dispatcherクラス（C#関数配列）
### C#の関数配列

```cs:CsFunctionsCompword.cs
        }
        private void ZzExit3L(){   /* ;DUMMYWORD */
                /* Mコード=0x0022 */
            // RstackPointer += 3;
            // McodePointer.w = (USHORT *)(*(RstackPointer-1));
            rtp.MoveStackPointer(3);
            mp.ResetMcodeIndex(rtp.GetUlOffset(-1));
            //rtp.MoveStackPointer(-1);
            //mp.ResetMcodeIndex(rtp.PopUs()); 
        }

        private void ZzReadDvarLocal(){
                /* Mコード=0x0055 */
            // ULONG 	*varAddr;
            // varAddr = (ULONG *)((UCHAR *)RstackPointer + FETCH_MCODE);
            // PUSH_L( *varAddr );
            // PUSH_F( 0 );            
            //rtp.MoveStackPointer(mp.FetchMcode());//returnスタックのインデックスをMCode領域の値で移動
            int point =(int)rtp.GetUb() + mp.FetchMcode();//returnスタックポインタの指すバイト値とMCode領域の値を加算
            dtp.PushUl(rtp.GetUlPoint(point));
            //dtp.PushUl(rtp.PopUl());
            dtp.PushUl(0);

        }        
```
```cs:CsFunctions1ker.cs
		/* [加え]のコンパイリングワード */
		private void	Kuwae()		/* ;WORD 加え       ※属性はgensymにて※　*/
		{
				/* Mコード=0x0107 */
				// LONG  data2;
				// data2  = POP_L_OF_Q;
				// L_OF_Q += data2;
				// #define  POP_L_OF_Q           (DROP_F,POP_L)
				//#define  L_OF_Q		      READ_L_OF_Q
				//#define  READ_L_OF_Q          (DstackPointer[1])
	        	dtp.PopUl();//≒DROP Dataスタックから取り出して捨てる
				int data2=(int)dtp.PopUl();
				dtp.SetUl((uint)(dtp.GetUlOffset(1)+data2));

		}
 ```
 
# つづく
生成されたhello.mcoを解釈して、C#側で「Hello by mind8」が出力されるようにするまでの長い道のりですが、実際のところ正規版のConsoleの初期化処理はかなり長いのでお題の文字列コンソール出力までにはかなりの代替関数を実装しなければなりません。一方、Mind開発者の@killyさんより情報共有いただいたMind8のCランタイムディスパッチャ起動検証用Consoleはそのあたりを思いっきりはっしょっているため、ほぼほぼすぐにお題の文字列コンソール出力に到達できました。

今回は正規版にもどっての検証でしたが、やはりなかなか先や終わりが見えないのは厳しいため、少し妙案を考え出しました。次回記事にて詳しくご説明いたします。