はじめに
こちらの記事にてMind開発者の@killyさんよりご提案いただいたMind8の検証用Consoleをベースに一部正規のConsoleのコードを取り込んだ中間コードステップ数84のhellolevel2.mcoの完走を試みています。本記事はこのバージョンの中間コードをC#で代替実装したディスパッチャで処理させている続きでます。
前提条件
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フォルダは正規のソースファイルが格納されたフォルダです。filelevel2フォルダは従来のfilelevel0フォルダです。
filedummyの内容はこちらの記事を、filelevel1,2(旧0)の内容はこちらの記事を参照してください。今回のお題はfilelevel2内のconslevel2.src上でビルドされたサンプルです。
C:\developments\vscode\mind8>tree
C:.
├─bin
├─file
│ └─obj
├─filedummy
│ └─obj
├─filelevel0
│ └─obj
├─filelevel1
│ └─obj
├─filelevel2
│ └─obj
├─kernel
│ └─.vscode
├─lib
├─libY
└─sample
お題のMindソースコード
こちらの記事を参照してください。
お題のMind8のソースファイル
メインとは
「Hello by mind8」を 表示すること。
アプリケーションとしてのユーザーコードは上記だけですが、Mind8ランタイムの初期化コードがいろいろな提示済単語をチェック処理していて、現在フルスペックのチェックコードを通過できないため、前記のような初期処理のショートカット版のバージョンを段階的に作成して完走を試みているというのが現状です。
お題のMind8の中間コード実行リスト
C側検証環境で、お題の中間コードファイルをディスパッチャで処理させます。
こちらの記事を参照してください。
お題の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 0036 54 8036 1024 0 0 1023 114 0
4 0080 128 8042 1024 0 0 1023 114 0
5 0036 54 8044 1024 0 0 1023 114 0
6 0070 112 8050 1024 0 0 1023 114 0
7 803A 32826 8052 1024 0 0 1023 114 0
8 002F 47 238 1024 0 0 1022 8052 114
9 80E6 32998 8032 1024 0 0 1022 8052 114
10 808F 32911 8026 1024 0 0 1021 8032 8052
11 0097 151 3626 1024 0 0 1020 8026 8032
12 0065 101 3628 1022 0 2 1020 8026 8032
13 0020 32 3634 1024 0 0 1020 8026 8032
14 80C1 32961 8028 1024 0 0 1021 8032 8052
15 0261 609 6430 1024 0 0 1020 8028 8032
16 8053 32851 6432 1022 0 4405280 1020 8028 8032
17 8052 32850 1042 1022 0 4405280 1019 6432 8028
18 001A 26 950 1022 0 4405280 1018 1042 6432
19 006B 107 952 1022 0 4405280 1016 0 0
20 0055 85 956 1024 0 0 1016 4405280 0
21 008F 143 960 1022 0 4405280 1016 4405280 0
22 00ED 237 962 1022 0 4405280 1016 4405280 0
23 0055 85 978 1024 0 0 1016 4405280 0
24 0012 18 982 1022 0 4405280 1016 4405280 0
25 00A2 162 984 1022 0 4405280 1016 4405280 0
26 00BF 191 990 1020 0 65535 1016 4405280 0
27 0095 149 992 1022 65535 4405280 1016 4405280 0
28 01D7 471 994 1020 0 0 1016 4405280 0
29 006B 107 996 1022 0 1 1016 4405280 0
30 0055 85 1000 1024 0 0 1016 4405280 0
31 00ED 237 1004 1022 0 1 1016 4405280 0
32 0055 85 1018 1024 0 0 1016 4405280 0
33 0055 85 1022 1022 0 4405280 1016 4405280 0
34 0103 259 1026 1020 0 1 1016 4405280 0
35 00BF 191 1028 1020 0 1 1016 4405280 0
36 0055 85 1030 1022 1 4405280 1016 4405280 0
37 0055 85 1034 1020 0 4405280 1016 4405280 0
38 0107 263 1038 1018 0 1 1016 4405280 0
39 0022 34 1040 1020 0 4405281 1016 4405280 0
40 0122 290 1044 1020 0 4405281 1019 6432 1
41 0020 32 1046 1022 1 4405280 1019 6432 1
42 0012 18 6434 1022 1 4405280 1020 1 8032
43 0165 357 6436 1022 1 4405280 1020 1 8032
44 80C0 32960 6446 1024 0 0 1020 1 8032
45 002F 47 6426 1024 0 0 1019 6446 1
46 0264 612 6580 1024 0 0 1019 6446 1
47 0104 260 6582 1022 0 1260624832 1019 6446 1
48 0065 101 6584 1022 1260624830 1260624832 1019 6446 1
49 0012 18 6590 1024 0 0 1019 6446 1
50 0036 54 6592 1024 0 0 1019 6446 1
51 0071 113 6598 1024 0 0 1019 6446 1
52 0020 32 6600 1024 0 0 1019 6446 1
53 0036 54 6448 1024 0 0 1020 1 8032
54 0074 116 6454 1024 0 0 1020 1 8032
55 0264 612 6456 1024 0 0 1020 1 8032
56 0104 260 6458 1022 0 1260625280 1020 1 8032
57 00EE 238 6460 1022 1260625278 1260625280 1020 1 8032
58 0020 32 6578 1024 0 0 1020 1 8032
59 0000 0 3 1024 0 0 1021 8032 8052
例外がスローされました: 'System.NullReferenceException' (mind8dispatch.dll の中)
前回ステップ57のmcode= 00EEが未実装でしたので、今回下記のように実装しています。if ( !count ) のヶ所はif(count!=1)と実装することで、次のステップのmcodeの値がCオリジナルと同じ値となりました。(真?の側に進行します。)
しかし、ステップ58のmcode= 0020の実行結果が現在オリジナルと異なってしまい、ステップ59のmcodeの値が不正となってしまっています。(本来ステップ59もmcode= 0020となる)
mcode= 0020の実装自体はほぼほぼ適合しているので、リターンスタックの状態ずれが起因として次に処理するmcodeの値が変わってしまっています。
お題のC#ソースコード
namespace Mind8Kernel
{
public partial class Dispatcher
{
/*------------------- 回数指定~繰り返し ------------------------*/
private void ZzDo(){ /* ;WORD $$DO */
/* Mコード=0x00ED */
// ULONG count;
// count = POP_L_OF_Q; /* カウントをpopする */
// if ( !count ) /* カウント=0 ? */
// {
// SKIP_MCODE( READ_MCODE_SHORT ); /* $$LOOPの次の位置に飛ぶ */
// }
// else
// {
// PUSH_R( count ); /* カウントを積む(long) */
// PUSH_R( 1 ); /* 初期値(1)を積む(long) */
// SKIP_MCODE_1WORD; /* $$LOOPへの飛び先をskip */
// }
dtp.PopUl();//≒DROP Dataスタックから取り出して捨てる
uint count=dtp.PopUl();
if(count!=1){
//mp.MoveMcodeIndexByByte(mp.ReadMcodeShort());
short mc=mp.ReadMcodeShort();
mp.MoveMcodeIndexByByte(mc);
}else{
dtp.PushUl(count);
dtp.PushUl(0);
mp.MoveMcodeIndex(1);
}
}
つづく
生成されたhello.mcoを解釈して、C#側で「Hello by mind8」が出力されるようにするまでの長い道のりですが(初期処理をショートカットすればこの処理自体は処理できていますが、初期処理をどの程度対応するかで道のりの長さは大きく変動しまして、カメの動きとなっております。)、このレベルの完走を引き続き行ってまいります。