LoginSignup
1
0

Mind8のランタイムディスパッチャC実装の代替実装をC#で行う(zzExit3L,zzReadDvarLocal,Kuwae)

Posted at

はじめに

こちらの記事にて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#の関数配列

CsFunctionsCompword.cs
        }
        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);

        }        
CsFunctions1ker.cs
		/* [加え]のコンパイリングワード */
		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はそのあたりを思いっきりはっしょっているため、ほぼほぼすぐにお題の文字列コンソール出力に到達できました。

今回は正規版にもどっての検証でしたが、やはりなかなか先や終わりが見えないのは厳しいため、少し妙案を考え出しました。次回記事にて詳しくご説明いたします。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0