はじめに
こちらの記事にてMind開発者の@killyさんより情報共有いただいたMind8のCランタイムディスパッチャ起動検証用Consoleでリビルドした中間コードhellodummy.mcoをリビルドし前回記事ではそちらの中間コードを使ってC#代替実装版はいったん完走の日の目を見ることができました。
本記事はその続きではありますが、いったん標準版のConsoleでビルドした中間コードhello.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の動作をデバッグ実行で探るために使用します。こちらの記事の環境となります。
お題のMind8の中間コードファイル
こちらの記事をご参照ください。また、こちらの記事に実際の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#の関数配列
}
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);
}
/* [加え]のコンパイリングワード */
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はそのあたりを思いっきりはっしょっているため、ほぼほぼすぐにお題の文字列コンソール出力に到達できました。
今回は正規版にもどっての検証でしたが、やはりなかなか先や終わりが見えないのは厳しいため、少し妙案を考え出しました。次回記事にて詳しくご説明いたします。