はじめに
本記事は日本語プログラミング言語Mind8のC言語で実装されているランタイムディスパッチャをC#で代替実装し、.NETのライブラリ資産を利用しやすくしたいという思惑の元に遂行されている企画の続きです。前回の記事で検証用コンソールの完走版にコードを追加した結果、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の動作をデバッグ実行で探るために使用します。こちらの記事の環境となります。
カスタマイズConsoleのビルド
Mind開発者の@killyさんよりご提供いただいた情報に従い、下記のようにカスタマイズConsoleのビルド用のフォルダfilelevel群を作成しています。
ビルド用フォルダ構成
現状は下記のようなフォルダ構成となります。filedummyフォルダは起動検証用Consoleのビルド環境です。fileフォルダは正規のソースファイルが格納されたフォルダです。
filedummyの内容はこちらの記事を、filelevel1,2(旧0)の内容はこちらの記事を参照してください。
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ソースコード
こちらの記事より「コンソール初期化・基本部」の定義部に独自に簡略化した「私のプログラム名と起動パラメータを設定0」を導入しています。
コンソール初期化・基本部とは (・ → ・)
(しばらくはシステムコールするな)
終了パラメータを クリアし ※CCONST.SRC
エラー文字列初期化し ※CERROR.SRC
空白文字列初期化し ※COUTPUT.SRC
エラー出力を本来の出力に切り替え ※COUTPUT.SRC
私のプログラム名と起動パラメータを設定0し
。
各ライブラリ初期化とは 本定義 (・ → ・)
コンソール初期化・基本部し ※本ソース示すること。
この範囲は今回の記事でも同じです。今回は「私のプログラム名と起動パラメータを設定0」の内容を変更しています。
level5
Mind文字列に変換して次のアドレスを得る0とは 処理単語 .N ※1999.07.04訂正
(ASCIZアドレス → 文字列、次のASCIZアドレス(または0))
アドレス1は 変数
バイト位置は 変数 ※←32bitに(1999.07.04)
アドレス1に 入れ
アドレス1を バイトロードし ゼロ?
ならば 空列と 0を 返し
終り
つぎに
空列と 0を 返し
。
Mind文字列に変換0とは 処理単語 .N
(ASCIZアドレス → 文字列)
Mind文字列に変換して次のアドレスを得て0 捨てること。
私のプログラム名と起動パラメータを設定0とは (・ → ・)
※※※※※※※※※※※※※※※※※※※※※※※※※
※ ・当モジュール内の$$COLD_FORTHから呼ばれる ※
※ ・この中で「私のプログラム名」もセットする ※
※※※※※※※※※※※※※※※※※※※※※※※※※
(私のプログラム名を決定)
c_mcodeFullFilenameを Mind文字列に変換0して
捨てること
。
level6
Mind文字列に変換して次のアドレスを得る0とは 処理単語 .N ※1999.07.04訂正
(ASCIZアドレス → 文字列、次のASCIZアドレス(または0))
アドレス1は 変数
バイト位置は 変数 ※←32bitに(1999.07.04)
アドレス1に 入れ
空列と 0を 返し
。
Mind文字列に変換0とは 処理単語 .N
(ASCIZアドレス → 文字列)
Mind文字列に変換して次のアドレスを得て0 捨てること。
私のプログラム名と起動パラメータを設定0とは (・ → ・)
※※※※※※※※※※※※※※※※※※※※※※※※※
※ ・当モジュール内の$$COLD_FORTHから呼ばれる ※
※ ・この中で「私のプログラム名」もセットする ※
※※※※※※※※※※※※※※※※※※※※※※※※※
(私のプログラム名を決定)
c_mcodeFullFilenameを Mind文字列に変換0して
捨てること
。
本来のお題のMind8のソースファイル
こちらの記事を参照してください。
お題のMind8の中間コード実行リスト
今回は省略しました。
level5は 80ステップ。 lebel6は 74ステップでした。
お題のC#ソースコード
前回の記事で検証用コンソールの完走版level4にコードを追加したlevel5,6のコードを切り分け用に調整した結果、mcode0052が関数枠だけ実装されていて中身が未実装であるため誤動作となっていることが判明しましたので、mcode0052を下記のように実装しました。この内容の妥当性は完全には確認されておらず、とりあえずlevel5とlevel6のコードが完走することが確認されています。
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」が出力されるようにするまでの長い道のりですが(初期処理をショートカットすればこの処理自体は処理できていますが、初期処理をどの程度対応するかで道のりの長さは大きく変動しまして、カメの動きとなっております。)、次のレベルの完走を引き続き行ってまいります。