はじめに
こちらの記事にてMind開発者の@killyさんよりご提案いただいたMind8の検証用Consoleをベースに一部正規のConsoleのコードを取り込んだ中間コードステップ数84のhellolevel2.mcoの完走をC#で代替実装したディスパッチャで試みています。また、こちらの記事では、既に完走させた中間コードステップ数60のhellolevel1.mcoを修正して、本来の順序で処理されるようhellolevel2.mcoの前半部分を追加して中間コードステップ数63のhellolevel3.mco完走させました。本記事ではhellolevel2.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の動作をデバッグ実行で探るために使用します。こちらの記事の環境となります。
カスタマイズConsoleのビルド
killyさんよりご提供いただいた情報に従い、下記のようにカスタマイズConsoleのビルド用のフォルダfilelevel群を作成しています。
ビルド用フォルダ構成
現状は下記のようなフォルダ構成となります。filedummyフォルダは起動検証用Consoleのビルド環境です。fileフォルダは正規のソースファイルが格納されたフォルダです。filelevel4フォルダは本記事のバージョンの格納フォルダです。
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
├─kernel
│ └─.vscode
├─lib
├─libY
└─sample
お題のMindソースコード
コンソール初期化・基本部とは (・ → ・)
(しばらくはシステムコールするな)
終了パラメータを クリアし ※CCONST.SRC
エラー文字列初期化し ※CERROR.SRC
空白文字列初期化し ※COUTPUT.SRC
エラー出力を本来の出力に切り替え ※COUTPUT.SRC
私のプログラム名と起動パラメータを設定0し
。
各ライブラリ初期化とは 本定義 (・ → ・)
コンソール初期化・基本部し ※本ソース示すること。
$$COLD_FORTHの内容を「各ライブラリ初期化」まで正規版Consoleと同じとして、さらに「各ライブラリ初期化」の中身も「コンソール初期化・基本部」までとし、そしてさらに「コンソール初期化・基本部」の中身を、level3ではlevel2の前半部分の「エラー出力を本来の出力に切り替え」を追加して完走させましたが、今回はlevel2の後半部分の「私のプログラム名と起動パラメータを設定」の定義内容を下記のように大幅削減し、現状で完走する範囲までとしています。
Mind文字列に変換して次のアドレスを得る0とは 処理単語 .N ※1999.07.04訂正
(ASCIZアドレス → 文字列、次のASCIZアドレス(または0))
アドレス1は 変数
バイト位置は 変数 ※←32bitに(1999.07.04)
アドレス1に 入れ
。
私のプログラム名と起動パラメータを設定0とは (・ → ・)
※※※※※※※※※※※※※※※※※※※※※※※※※
※ ・当モジュール内の$$COLD_FORTHから呼ばれる ※
※ ・この中で「私のプログラム名」もセットする ※
※※※※※※※※※※※※※※※※※※※※※※※※※
(私のプログラム名を決定)
c_mcodeFullFilenameを Mind文字列に変換して次のアドレスを得て0
。
本来のお題のMind8のソースファイル
メインとは
「Hello by mind8」を 表示すること。
アプリケーションとしてのユーザーコードは上記だけですが、Mind8ランタイムの初期化コードがいろいろな提示済単語をチェック処理していて、現在フルスペックのチェックコードを通過できないため、前記のような初期処理のショートカット版のバージョンを段階的に作成して完走を試みているというのが現状です。
お題のMind8の中間コード実行リスト
C側検証環境で、お題の中間コードファイルをディスパッチャで処理させます。
SqNo mcode mc(dec) mpoint dtp.point dtp+0 dtp+1 rtp.point rtp+0 rtp+1
1 8019 32793 114 1024 1819242324 1442864243 1024 0 0
2 002F 47 102 1024 1819242324 1442864243 1023 12603162 0
3 0012 18 8062 1024 1819242324 1442864243 1023 12603162 0
4 0036 54 8064 1024 1819242324 1442864243 1023 12603162 0
5 0080 128 8070 1024 1819242324 1442864243 1023 12603162 0
6 0036 54 8072 1024 1819242324 1442864243 1023 12603162 0
7 0070 112 8078 1024 1819242324 1442864243 1023 12603162 0
8 803A 32826 8080 1024 1819242324 1442864243 1023 12603162 0
9 002F 47 238 1024 1819242324 1442864243 1022 12611128 12603162
10 80E8 33000 8058 1024 1819242324 1442864243 1022 12611128 12603162
11 0036 54 8040 1024 1819242324 1442864243 1021 12611106 12611128
12 0071 113 8046 1024 1819242324 1442864243 1021 12611106 12611128
13 8046 32838 8048 1024 1819242324 1442864243 1021 12611106 12611128
14 8045 32837 326 1024 1819242324 1442864243 1020 12611096 12611106
15 0012 18 314 1024 1819242324 1442864243 1019 12603374 12611096
16 0036 54 316 1024 1819242324 1442864243 1019 12603374 12611096
17 0074 116 322 1024 1819242324 1442864243 1019 12603374 12611096
18 0020 32 324 1024 1819242324 1442864243 1019 12603374 12611096
19 0020 32 328 1024 1819242324 1442864243 1020 12611096 12611106
20 80A3 32931 8050 1024 1819242324 1442864243 1021 12611106 12611128
21 0036 54 3884 1024 1819242324 1442864243 1020 12611098 12611106
22 0012 18 3890 1024 1819242324 1442864243 1020 12611098 12611106
23 016E 366 3892 1024 1819242324 1442864243 1020 12611098 12611106
24 0020 32 3898 1024 1819242324 1442864243 1020 12611098 12611106
25 808F 32911 8052 1024 1819242324 1442864243 1021 12611106 12611128
26 0097 151 3626 1024 1819242324 1442864243 1020 12611100 12611106
27 0065 101 3628 1022 0 2 1020 12611100 12611106
28 0020 32 3634 1024 1819242324 1442864243 1020 12611100 12611106
29 80E7 32999 8054 1024 1819242324 1442864243 1021 12611106 12611128
30 0261 609 8034 1024 1819242324 1442864243 1020 12611102 12611106
31 80E6 32998 8036 1022 0 4646640 1020 12611102 12611106
32 001A 26 8026 1022 0 4646640 1019 12611084 12611102
33 006B 107 8028 1022 0 4646640 1017 0 0
34 0022 34 8032 1024 1819242324 1442864243 1017 4646640 0
35 0020 32 8038 1024 1819242324 1442864243 1020 12611102 12611106
36 0020 32 8056 1024 1819242324 1442864243 1021 12611106 12611128
37 0020 32 8060 1024 1819242324 1442864243 1022 12611128 12603162
38 00A5 165 8082 1024 1819242324 1442864243 1023 12603162 0
39 803C 32828 8106 1022 20 12611132 1023 12603162 0
40 002F 47 246 1022 20 12611132 1022 12611154 12603162
41 001A 26 5802 1022 20 12611132 1022 12611154 12603162
42 006E 110 5804 1022 20 12611132 1020 12611102 12611106
43 0015 21 5808 1024 1819242324 1442864243 1020 20 12611132
44 00ED 237 5810 1022 0 1 1020 20 12611132
45 0022 34 5830 1024 1819242324 1442864243 1020 20 12611132
46 00A5 165 8108 1024 1819242324 1442864243 1023 12603162 0
47 00C1 193 8126 1022 14 12611158 1023 12603162 0
$$COLD_FORTH
48 0020 32 8128 1024 1819242324 1442864243 1023 12603162 0
49 80F3 33011 116 1024 1819242324 1442864243 1024 0 0
50 00A5 165 8578 1024 1819242324 1442864243 1023 12603164 0
0
60 002F 47 106 1024 1819242324 1442864243 1023 12603166 0
61 00A5 165 8156 1024 1819242324 1442864243 1023 12603166 0
62 00C1 193 8170 1022 10 12611206 1023 12603166 0
実行終り
63 801B 32795 8172 1024 1819242324 1442864243 1023 12603166 0
64 002F 47 110 1024 1819242324 1442864243 1022 12611220 12603166
65 00A5 165 8130 1024 1819242324 1442864243 1022 12611220 12603166
66 00C1 193 8152 1022 18 12611180 1022 12611220 12603166
実行終り時の処理
67 0020 32 8154 1024 1819242324 1442864243 1022 12611220 12603166
68 0012 18 8174 1024 1819242324 1442864243 1023 12603166 0
69 004E 78 8176 1024 1819242324 1442864243 1023 12603166 0
70 0014 20 8182 1022 0 0 1023 12603166 0
アドレス値はC#代替互換に変換していないので、少しわかりづらいですが、このバージョンの中間コードステップ数は70であることがわかります。
お題の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 0012 18 8062 1024 0 0 1023 114 0
4 0036 54 8064 1024 0 0 1023 114 0
5 0080 128 8070 1024 0 0 1023 114 0
6 0036 54 8072 1024 0 0 1023 114 0
7 0070 112 8078 1024 0 0 1023 114 0
8 803A 32826 8080 1024 0 0 1023 114 0
9 002F 47 238 1024 0 0 1022 8080 114
10 80E8 33000 8058 1024 0 0 1022 8080 114
11 0036 54 8040 1024 0 0 1021 8058 8080
12 0071 113 8046 1024 0 0 1021 8058 8080
13 8046 32838 8048 1024 0 0 1021 8058 8080
14 8045 32837 326 1024 0 0 1020 8048 8058
15 0012 18 314 1024 0 0 1019 326 8048
16 0036 54 316 1024 0 0 1019 326 8048
17 0074 116 322 1024 0 0 1019 326 8048
18 0020 32 324 1024 0 0 1019 326 8048
19 0020 32 328 1024 0 0 1020 8048 8058
20 80A3 32931 8050 1024 0 0 1021 8058 8080
21 0036 54 3884 1024 0 0 1020 8050 8058
22 0012 18 3890 1024 0 0 1020 8050 8058
23 016E 366 3892 1024 0 0 1020 8050 8058
24 0020 32 3898 1024 0 0 1020 8050 8058
25 808F 32911 8052 1024 0 0 1021 8058 8080
26 0097 151 3626 1024 0 0 1020 8052 8058
27 0065 101 3628 1022 0 2 1020 8052 8058
28 0020 32 3634 1024 0 0 1020 8052 8058
29 80E7 32999 8054 1024 0 0 1021 8058 8080
30 0261 609 8034 1024 0 0 1020 8054 8058
31 80E6 32998 8036 1022 0 7878112 1020 8054 8058
32 001A 26 8026 1022 0 7878112 1019 8036 8054
33 006B 107 8028 1022 0 7878112 1017 0 0
34 0022 34 8032 1024 0 0 1017 7878112 0
35 0020 32 8038 1024 0 0 1020 8054 8058
36 0020 32 8056 1024 0 0 1021 8058 8080
37 0020 32 8060 1024 0 0 1022 8080 114
38 00A5 165 8082 1024 0 0 1023 114 0
39 803C 32828 8106 1022 20 8084 1023 114 0
40 002F 47 246 1022 20 8084 1022 8106 114
41 001A 26 5802 1022 20 8084 1022 8106 114
42 006E 110 5804 1022 20 8084 1020 8054 8058
43 0015 21 5808 1024 0 0 1020 20 8058
44 00ED 237 5810 1022 0 1 1020 20 8058
45 0022 34 5830 1024 0 0 1020 20 8058
46 00A5 165 8108 1024 0 0 1023 114 0
47 00C1 193 8126 1022 14 8110 1023 114 0
$$COLD_FORTH
48 0020 32 8128 1024 0 0 1023 114 0
49 80F3 33011 116 1024 0 0 1024 0 0
50 00A5 165 8578 1024 0 0 1023 116 0
51 8083 32899 8596 1022 14 8580 1023 116 0
52 0012 18 3510 1022 14 8580 1022 8596 116
53 004E 78 3512 1022 14 8580 1022 8596 116
54 00EC 236 3518 1020 0 0 1022 8596 116
55 0096 150 3524 1022 14 8580 1022 8596 116
56 026D 621 3526 1020 0 1 1022 8596 116
Hello by mind8
57 0020 32 3528 1024 0 0 1022 8596 116
58 0020 32 8598 1024 0 0 1023 116 0
59 801A 32794 118 1024 0 0 1024 0 0
60 002F 47 106 1024 0 0 1023 118 0
61 00A5 165 8156 1024 0 0 1023 118 0
62 00C1 193 8170 1022 10 8158 1023 118 0
実行終り
63 801B 32795 8172 1024 0 0 1023 118 0
64 002F 47 110 1024 0 0 1022 8172 118
65 00A5 165 8130 1024 0 0 1022 8172 118
66 00C1 193 8152 1022 18 8132 1022 8172 118
実行終り時の処理
67 0020 32 8154 1024 0 0 1022 8172 118
68 0012 18 8174 1024 0 0 1023 118 0
69 004E 78 8176 1024 0 0 1023 118 0
70 0014 20 8182 1022 0 0 1023 118 0
例外がスローされました: 'Mind8Kernel.Dispatcher.ExitModule' (mind8dispatch.dll の中)
プログラム '[11372] mind8dispatch.dll' がコード 0 (0x0) で終了しました。
とりあえず今回のhellolevel4.mcoの状態であれば完走することがわかりました。
つづく
生成されたhello.mcoを解釈して、C#側で「Hello by mind8」が出力されるようにするまでの長い道のりですが(初期処理をショートカットすればこの処理自体は処理できていますが、初期処理をどの程度対応するかで道のりの長さは大きく変動しまして、カメの動きとなっております。)、次のレベルの完走を引き続き行ってまいります。