【祝！hellolevel5,6完走】Mind8のランタイムディスパッチャC実装の代替実装をC#で行う(ZzReadJvar)

# はじめに
本記事は日本語プログラミング言語Mind8のC言語で実装されているランタイムディスパッチャをC#で代替実装し、.NETのライブラリ資産を利用しやすくしたいという思惑の元に遂行されている企画の続きです。[前回の記事](https://qiita.com/mylifewithviolin/items/c263f130a73bdc023bed)で検証用コンソールの完走版にコードを追加した結果、mcode0052が関数枠だけ実装されていて中身が未実装であるため誤動作となっていることが判明しました。今回はその修正（実装）版による結果です。

# 前提条件
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のビルド
Mind開発者の@killyさんよりご提供いただいた情報に従い、下記のようにカスタマイズConsoleのビルド用のフォルダfilelevel群を作成しています。

## ビルド用フォルダ構成
現状は下記のようなフォルダ構成となります。filedummyフォルダは起動検証用Consoleのビルド環境です。fileフォルダは正規のソースファイルが格納されたフォルダです。
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
├─filelevel5 <--完走
│  └─obj
├─filelevel6 <--完走
│  └─obj
├─kernel
│  └─.vscode
├─lib
├─libY
└─sample
```

filelevel5,6フォルダは本記事のバージョンの格納フォルダです。filelevel2のソースコードの一部を追加しています。

# お題のMindソースコード
[こちらの記事](https://qiita.com/mylifewithviolin/items/6449285131c973ae2b28)より「コンソール初期化・基本部」の定義部に独自に簡略化した「私のプログラム名と起動パラメータを設定０」を導入しています。

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

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

この範囲は今回の記事でも同じです。今回は「私のプログラム名と起動パラメータを設定０」の内容を変更しています。


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

　　　　アドレス１に　入れ
	アドレス１を　バイトロードし　ゼロ？
		ならば　空列と　０を　返し
			終り
		つぎに
	空列と　０を　返し
。

Ｍｉｎｄ文字列に変換０とは　処理単語  .N
　（ASCIZアドレス　→　文字列）
　　　　Ｍｉｎｄ文字列に変換して次のアドレスを得て０  捨てること。

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

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

　　　　アドレス１に　入れ
	空列と　０を　返し
。

Ｍｉｎｄ文字列に変換０とは　処理単語  .N
　（ASCIZアドレス　→　文字列）
　　　　Ｍｉｎｄ文字列に変換して次のアドレスを得て０  捨てること。

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

```

## 本来のお題のMind8のソースファイル
[こちらの記事](https://qiita.com/mylifewithviolin/items/6449285131c973ae2b28)を参照してください。


# お題のMind8の中間コード実行リスト
今回は省略しました。
level5は 80ステップ。 lebel6は 74ステップでした。

# お題のC#ソースコード
[前回の記事](https://qiita.com/mylifewithviolin/items/c263f130a73bdc023bed)で検証用コンソールの完走版level4にコードを追加したlevel5,6のコードを切り分け用に調整した結果、mcode0052が関数枠だけ実装されていて中身が未実装であるため誤動作となっていることが判明しましたので、mcode0052を下記のように実装しました。この内容の妥当性は完全には確認されておらず、とりあえずlevel5とlevel6のコードが完走することが確認されています。

```cs:CsFunctionsCompword.cs
namespace Mind8Kernel
{
    public partial class Dispatcher
    {

        private void ZzReadJvar(){
                /* Mコード=0x0052 */
            // ULONG  *varAddr;
            // ULONG   length;
            // ULONG   margin;
            // varAddr = (ULONG *)(DataBase + FETCH_MCODE_LONG);
            // length = *varAddr++;
            // margin = *varAddr++;
            // PUSH_A( (UCHAR *)varAddr + margin );    /* push address */
            // PUSH_C( length );                       /* push length  */
            ap.ResetDataIndex(mp.FetchMcodeInt());
            uint length=ap.GetUl();
            uint margin=ap.GetUl();
            dtp.PushUl(ap.GetUl() + margin);
            dtp.PushUl(length);
        }
     
     }
}

```        
# お題のMind8の中間コードのC#代替ディスパッチャ実行リスト

まずlevel5の結果です。完走しました。

level5
```
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   8098   1024        0        0   1023      114        0
   4 0036     54   8100   1024        0        0   1023      114        0
   5 0080    128   8106   1024        0        0   1023      114        0
   6 0036     54   8108   1024        0        0   1023      114        0
   7 0070    112   8114   1024        0        0   1023      114        0
   8 803A  32826   8116   1024        0        0   1023      114        0
   9 002F     47    238   1024        0        0   1022     8116      114
  10 80E9  33001   8094   1024        0        0   1022     8116      114
  11 0036     54   8076   1024        0        0   1021     8094     8116
  12 0071    113   8082   1024        0        0   1021     8094     8116
  13 8046  32838   8084   1024        0        0   1021     8094     8116
  14 8045  32837    326   1024        0        0   1020     8084     8094
  15 0012     18    314   1024        0        0   1019      326     8084
  16 0036     54    316   1024        0        0   1019      326     8084
  17 0074    116    322   1024        0        0   1019      326     8084
  18 0020     32    324   1024        0        0   1019      326     8084
  19 0020     32    328   1024        0        0   1020     8084     8094
  20 80A3  32931   8086   1024        0        0   1021     8094     8116
  21 0036     54   3884   1024        0        0   1020     8086     8094
  22 0012     18   3890   1024        0        0   1020     8086     8094
  23 016E    366   3892   1024        0        0   1020     8086     8094
  24 0020     32   3898   1024        0        0   1020     8086     8094
  25 808F  32911   8088   1024        0        0   1021     8094     8116
  26 0097    151   3626   1024        0        0   1020     8088     8094
  27 0065    101   3628   1022        0        2   1020     8088     8094
  28 0020     32   3634   1024        0        0   1020     8088     8094
  29 80E8  33000   8090   1024        0        0   1021     8094     8116
  30 0261    609   8068   1024        0        0   1020     8090     8094
  31 80E7  32999   8070   1022        0 3539625600   1020     8090     8094
  32 80E6  32998   8062   1022        0 3539625600   1019     8070     8090
  33 001A     26   8026   1022        0 3539625600   1018     8062     8070
  34 006B    107   8028   1022        0 3539625600   1016        0        0
  35 0055     85   8032   1024        0        0   1016 3539625600        0
  36 008F    143   8036   1022        0 3539625600   1016 3539625600        0
  37 00ED    237   8038   1022        0 3539625600   1016 3539625600        0
  38 0012     18   8050   1024        0        0   1016 3539625600        0
  39 0052     82   8052   1024        0        0   1016 3539625600        0
  40 0095    149   8058   1022        0        0   1016 3539625600        0
  41 0022     34   8060   1020        0        0   1016 3539625600        0
  42 0122    290   8064   1020        0        0   1019     8070     8090
  43 0020     32   8066   1022        0        0   1019     8070     8090
  44 0122    290   8072   1022        0        0   1020     8090     8094
  45 0020     32   8074   1024        0        0   1020     8090     8094
  46 0020     32   8092   1024        0        0   1021     8094     8116
  47 0020     32   8096   1024        0        0   1022     8116      114
  48 00A5    165   8118   1024        0        0   1023      114        0
  49 803C  32828   8142   1022       20     8120   1023      114        0
  50 002F     47    246   1022       20     8120   1022     8142      114
  51 001A     26   5802   1022       20     8120   1022     8142      114
  52 006E    110   5804   1022       20     8120   1020     8090     8094
  53 0015     21   5808   1024        0        0   1020       20     8094
  54 00ED    237   5810   1022        0        1   1020       20     8094
  55 0022     34   5830   1024        0        0   1020       20     8094
  56 00A5    165   8144   1024        0        0   1023      114        0
  57 00C1    193   8162   1022       14     8146   1023      114        0
$$COLD_FORTH
  58 0020     32   8164   1024        0        0   1023      114        0
  59 80F4  33012    116   1024        0        0   1024        0        0
  60 00A5    165   8610   1024        0        0   1023      116        0
  61 8083  32899   8628   1022       14     8612   1023      116        0
  62 0012     18   3510   1022       14     8612   1022     8628      116
  63 004E     78   3512   1022       14     8612   1022     8628      116
  64 00EC    236   3518   1020        0        0   1022     8628      116
  65 0096    150   3524   1022       14     8612   1022     8628      116
  66 026D    621   3526   1020        0        1   1022     8628      116
Hello by mind8
  67 0020     32   3528   1024        0        0   1022     8628      116
  68 0020     32   8630   1024        0        0   1023      116        0
  69 801A  32794    118   1024        0        0   1024        0        0
  70 002F     47    106   1024        0        0   1023      118        0
  71 00A5    165   8192   1024        0        0   1023      118        0
  72 00C1    193   8206   1022       10     8194   1023      118        0
実行終り
  73 801B  32795   8208   1024        0        0   1023      118        0
  74 002F     47    110   1024        0        0   1022     8208      118
  75 00A5    165   8166   1024        0        0   1022     8208      118
  76 00C1    193   8188   1022       18     8168   1022     8208      118
実行終り時の処理
  77 0020     32   8190   1024        0        0   1022     8208      118
  78 0012     18   8210   1024        0        0   1023      118        0
  79 004E     78   8212   1024        0        0   1023      118        0
  80 0014     20   8218   1022        0        0   1023      118        0
例外がスローされました: 'Mind8Kernel.Dispatcher.ExitModule' (mind8dispatch.dll の中)
プログラム '[10852] mind8dispatch.dll' がコード 0 (0x0) で終了しました。
```
続いてlevel6の結果です。こちらも完走しました。
level6
```
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   8078   1024        0        0   1023      114        0
   4 0036     54   8080   1024        0        0   1023      114        0
   5 0080    128   8086   1024        0        0   1023      114        0
   6 0036     54   8088   1024        0        0   1023      114        0
   7 0070    112   8094   1024        0        0   1023      114        0
   8 803A  32826   8096   1024        0        0   1023      114        0
   9 002F     47    238   1024        0        0   1022     8096      114
  10 80E9  33001   8074   1024        0        0   1022     8096      114
  11 0036     54   8056   1024        0        0   1021     8074     8096
  12 0071    113   8062   1024        0        0   1021     8074     8096
  13 8046  32838   8064   1024        0        0   1021     8074     8096
  14 8045  32837    326   1024        0        0   1020     8064     8074
  15 0012     18    314   1024        0        0   1019      326     8064
  16 0036     54    316   1024        0        0   1019      326     8064
  17 0074    116    322   1024        0        0   1019      326     8064
  18 0020     32    324   1024        0        0   1019      326     8064
  19 0020     32    328   1024        0        0   1020     8064     8074
  20 80A3  32931   8066   1024        0        0   1021     8074     8096
  21 0036     54   3884   1024        0        0   1020     8066     8074
  22 0012     18   3890   1024        0        0   1020     8066     8074
  23 016E    366   3892   1024        0        0   1020     8066     8074
  24 0020     32   3898   1024        0        0   1020     8066     8074
  25 808F  32911   8068   1024        0        0   1021     8074     8096
  26 0097    151   3626   1024        0        0   1020     8068     8074
  27 0065    101   3628   1022        0        2   1020     8068     8074
  28 0020     32   3634   1024        0        0   1020     8068     8074
  29 80E8  33000   8070   1024        0        0   1021     8074     8096
  30 0261    609   8048   1024        0        0   1020     8070     8074
  31 80E7  32999   8050   1022        0 1758563824   1020     8070     8074
  32 80E6  32998   8042   1022        0 1758563824   1019     8050     8070
  33 001A     26   8026   1022        0 1758563824   1018     8042     8050
  34 006B    107   8028   1022        0 1758563824   1016        0        0
  35 0052     82   8032   1024        0        0   1016 1758563824        0
  36 0095    149   8038   1022        0        0   1016 1758563824        0
  37 0022     34   8040   1020        0        0   1016 1758563824        0
  38 0122    290   8044   1020        0        0   1019     8050     8070
  39 0020     32   8046   1022        0        0   1019     8050     8070
  40 0122    290   8052   1022        0        0   1020     8070     8074
  41 0020     32   8054   1024        0        0   1020     8070     8074
  42 0020     32   8072   1024        0        0   1021     8074     8096
  43 0020     32   8076   1024        0        0   1022     8096      114
  44 00A5    165   8098   1024        0        0   1023      114        0
  45 803C  32828   8122   1022       20     8100   1023      114        0
  46 002F     47    246   1022       20     8100   1022     8122      114
  47 001A     26   5802   1022       20     8100   1022     8122      114
  48 006E    110   5804   1022       20     8100   1020     8070     8074
  49 0015     21   5808   1024        0        0   1020       20     8074
  50 00ED    237   5810   1022        0        1   1020       20     8074
  51 0022     34   5830   1024        0        0   1020       20     8074
  52 00A5    165   8124   1024        0        0   1023      114        0
  53 00C1    193   8142   1022       14     8126   1023      114        0
$$COLD_FORTH
  54 0020     32   8144   1024        0        0   1023      114        0
  55 80F4  33012    116   1024        0        0   1024        0        0
  56 00A5    165   8594   1024        0        0   1023      116        0
  57 8083  32899   8612   1022       14     8596   1023      116        0
  58 0012     18   3510   1022       14     8596   1022     8612      116
  59 004E     78   3512   1022       14     8596   1022     8612      116
  60 00EC    236   3518   1020        0        0   1022     8612      116
  61 0096    150   3524   1022       14     8596   1022     8612      116
  62 026D    621   3526   1020        0        1   1022     8612      116
Hello by mind8  63 0020     32   3528   1024        0        0   1022     8612      116
  64 0020     32   8614   1024        0        0   1023      116        0
  65 801A  32794    118   1024        0        0   1024        0        0
  66 002F     47    106   1024        0        0   1023      118        0
  67 00A5    165   8172   1024        0        0   1023      118        0
  68 00C1    193   8186   1022       10     8174   1023      118        0
実行終り
  69 801B  32795   8188   1024        0        0   1023      118        0
  70 002F     47    110   1024        0        0   1022     8188      118
  71 00A5    165   8146   1024        0        0   1022     8188      118
  72 00C1    193   8168   1022       18     8148   1022     8188      118
実行終り時の処理
  73 0020     32   8170   1024        0        0   1022     8188      118
  74 0012     18   8190   1024        0        0   1023      118        0
  75 004E     78   8192   1024        0        0   1023      118        0
  76 0014     20   8198   1022        0        0   1023      118        0
例外がスローされました: 'Mind8Kernel.Dispatcher.ExitModule' (mind8dispatch.dll の中)
プログラム '[13608] mind8dispatch.dll' がコード 0 (0x0) で終了しました。
```

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