0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Mind8のランタイムディスパッチャC実装の代替実装をC#で行う(空列を返せない)

Last updated at Posted at 2024-09-22

はじめに

本記事は日本語プログラミング言語Mind8のC言語で実装されているランタイムディスパッチャをC#で代替実装し、.NETのライブラリ資産を利用しやすくしたいという思惑の元に遂行されている企画の続きです。ただし現状はMind8が実装している基本的な言語仕様の部分で互換性を実装するところで難航しているところです。前回の記事で検証用コンソールの完走点を確認しましたので、今回はそれに対してコードを追加します。

前提条件

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フォルダは本記事のバージョンの格納フォルダです。

お題のMindソースコード

前回の記事で「コンソール初期化・基本部」の定義部に独自に簡略化した「私のプログラム名と起動パラメータを設定0」を導入しています。

conslevel4(,5,6).src
コンソール初期化・基本部とは  (・  →  ・)
 (しばらくはシステムコールするな)
    終了パラメータを クリアし        ※CCONST.SRC
    エラー文字列初期化し           ※CERROR.SRC
    空白文字列初期化し            ※COUTPUT.SRC
	   エラー出力を本来の出力に切り替え     ※COUTPUT.SRC
       私のプログラム名と起動パラメータを設定0し
	。

各ライブラリ初期化とは     本定義     (・  →  ・)
    コンソール初期化・基本部し           ※本ソース示すること。

この範囲は今回の記事でも同じです。今回は「私のプログラム名と起動パラメータを設定0」の内容を変更しています。

下記は前回記事の状態です。

conslevel4.src
Mind文字列に変換して次のアドレスを得る0とは 処理単語  .N ※1999.07.04訂正
 (ASCIZアドレス → 文字列、次のASCIZアドレス(または0))
        アドレス1は 変数
        バイト位置は 変数		  ※←32bitに(1999.07.04)

    アドレス1に 入れ
。

私のプログラム名と起動パラメータを設定0とは  (・  → ・)
  	※※※※※※※※※※※※※※※※※※※※※※※※※
	※ ・当モジュール内の$$COLD_FORTHから呼ばれる ※
  	※ ・この中で「私のプログラム名」もセットする ※
  	※※※※※※※※※※※※※※※※※※※※※※※※※
  (私のプログラム名を決定)
	c_mcodeFullFilenameを Mind文字列に変換して次のアドレスを得て0
。

これに対して今回は
level5

conslevel5.src
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

conslevel6.src
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して 
	捨てること
。

としています。level5は欲張りすぎで結果的には動きませんでした。そこでlevel6でコード量を削減しました。が、こちらも動きませんでした。しかし、両者の実行結果からある仮説が導き出されました。

本来のお題のMind8のソースファイル

前回の記事を参照してください。

お題のMind8の中間コード実行リスト

今回は省略しました。
level5は 80ステップ。 lebel6は 74ステップでした。
level4は 70ステップです。

お題のMind8の中間コードのC#代替ディスパッチャ実行リスト

少し長くなりますが前回完走しているlevel4のソースコード状態も例示していますので、結果も参考掲示いたします。完走している状態とその後のlevel5,6の結果の違いを説明しやすくするためです。
level4

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) で終了しました。

続いて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   8102   1024        0        0   1023      114        0
   4 0036     54   8104   1024        0        0   1023      114        0
   5 0080    128   8110   1024        0        0   1023      114        0
   6 0036     54   8112   1024        0        0   1023      114        0
   7 0070    112   8118   1024        0        0   1023      114        0
   8 803A  32826   8120   1024        0        0   1023      114        0
   9 002F     47    238   1024        0        0   1022     8120      114
  10 80E9  33001   8098   1024        0        0   1022     8120      114
  11 0036     54   8080   1024        0        0   1021     8098     8120
  12 0071    113   8086   1024        0        0   1021     8098     8120
  13 8046  32838   8088   1024        0        0   1021     8098     8120
  14 8045  32837    326   1024        0        0   1020     8088     8098
  15 0012     18    314   1024        0        0   1019      326     8088
  16 0036     54    316   1024        0        0   1019      326     8088
  17 0074    116    322   1024        0        0   1019      326     8088
  18 0020     32    324   1024        0        0   1019      326     8088
  19 0020     32    328   1024        0        0   1020     8088     8098
  20 80A3  32931   8090   1024        0        0   1021     8098     8120
  21 0036     54   3884   1024        0        0   1020     8090     8098
  22 0012     18   3890   1024        0        0   1020     8090     8098
  23 016E    366   3892   1024        0        0   1020     8090     8098
  24 0020     32   3898   1024        0        0   1020     8090     8098
  25 808F  32911   8092   1024        0        0   1021     8098     8120
  26 0097    151   3626   1024        0        0   1020     8092     8098
  27 0065    101   3628   1022        0        2   1020     8092     8098
  28 0020     32   3634   1024        0        0   1020     8092     8098
  29 80E8  33000   8094   1024        0        0   1021     8098     8120
  30 0261    609   8072   1024        0        0   1020     8094     8098
  31 80E7  32999   8074   1022        0 2151883808   1020     8094     8098
  32 80E6  32998   8066   1022        0 2151883808   1019     8074     8094
  33 001A     26   8026   1022        0 2151883808   1018     8066     8074
  34 006B    107   8028   1022        0 2151883808   1016        0        0
  35 0055     85   8032   1024        0        0   1016 2151883808        0
  36 008F    143   8036   1022        0 2151883808   1016 2151883808        0
  37 00ED    237   8038   1022        0 2151883808   1016 2151883808        0
  38 0012     18   8054   1024        0        0   1016 2151883808        0
  39 0052     82   8056   1024        0        0   1016 2151883808        0
  40 0A74   2676   8058   1024        0        0   1016 2151883808        0
例外がスローされました: 'System.IndexOutOfRangeException' (mind8dispatch.dll の中)

続いてlevel6の結果です。level5のコードの後ろをけずったにも関わらず、同じような位置で止まっていますことから、ある仮設を思い浮かべます。
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 2322422464   1020     8070     8074
  32 80E6  32998   8042   1022        0 2322422464   1019     8050     8070
  33 001A     26   8026   1022        0 2322422464   1018     8042     8050
  34 006B    107   8028   1022        0 2322422464   1016        0        0
  35 0052     82   8032   1024        0        0   1016 2322422464        0
  36 0A74   2676   8034   1024        0        0   1016 2322422464        0
例外がスローされました: 'System.IndexOutOfRangeException' (mind8dispatch.dll の中)

お題のMindソースコード(level6の切り分け用修正)

もしかして「空列と 0を 返し」の「空列」がよろしくないのでは?と。
そこで、level6を下記のように修正してみました。「空列と」を除く。
level6(改)

conslevel6.src
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の中間コードのC#代替ディスパッチャ実行リスト

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   8070   1024        0        0   1023      114        0
   4 0036     54   8072   1024        0        0   1023      114        0
   5 0080    128   8078   1024        0        0   1023      114        0
   6 0036     54   8080   1024        0        0   1023      114        0
   7 0070    112   8086   1024        0        0   1023      114        0
   8 803A  32826   8088   1024        0        0   1023      114        0
   9 002F     47    238   1024        0        0   1022     8088      114
  10 80E9  33001   8066   1024        0        0   1022     8088      114
  11 0036     54   8048   1024        0        0   1021     8066     8088
  12 0071    113   8054   1024        0        0   1021     8066     8088
  13 8046  32838   8056   1024        0        0   1021     8066     8088
  14 8045  32837    326   1024        0        0   1020     8056     8066
  15 0012     18    314   1024        0        0   1019      326     8056
  16 0036     54    316   1024        0        0   1019      326     8056
  17 0074    116    322   1024        0        0   1019      326     8056
  18 0020     32    324   1024        0        0   1019      326     8056
  19 0020     32    328   1024        0        0   1020     8056     8066
  20 80A3  32931   8058   1024        0        0   1021     8066     8088
  21 0036     54   3884   1024        0        0   1020     8058     8066
  22 0012     18   3890   1024        0        0   1020     8058     8066
  23 016E    366   3892   1024        0        0   1020     8058     8066
  24 0020     32   3898   1024        0        0   1020     8058     8066
  25 808F  32911   8060   1024        0        0   1021     8066     8088
  26 0097    151   3626   1024        0        0   1020     8060     8066
  27 0065    101   3628   1022        0        2   1020     8060     8066
  28 0020     32   3634   1024        0        0   1020     8060     8066
  29 80E8  33000   8062   1024        0        0   1021     8066     8088
  30 0261    609   8042   1024        0        0   1020     8062     8066
  31 80E7  32999   8044   1022        0 2155348288   1020     8062     8066
  32 80E6  32998   8036   1022        0 2155348288   1019     8044     8062
  33 001A     26   8026   1022        0 2155348288   1018     8036     8044
  34 006B    107   8028   1022        0 2155348288   1016        0        0
  35 0095    149   8032   1024        0        0   1016 2155348288        0
  36 0022     34   8034   1022        0        0   1016 2155348288        0
  37 0122    290   8038   1022        0        0   1019     8044     8062
  38 0020     32   8040   1024        0        0   1019     8044     8062
  39 0020     32   8046   1024        0        0   1020     8062     8066
  40 0020     32   8064   1024        0        0   1021     8066     8088
  41 0020     32   8068   1024        0        0   1022     8088      114
  42 00A5    165   8090   1024        0        0   1023      114        0
  43 803C  32828   8114   1022       20     8092   1023      114        0
  44 002F     47    246   1022       20     8092   1022     8114      114
  45 001A     26   5802   1022       20     8092   1022     8114      114
  46 006E    110   5804   1022       20     8092   1020     8062     8066
  47 0015     21   5808   1024        0        0   1020       20     8066
  48 00ED    237   5810   1022        0        1   1020       20     8066
  49 0022     34   5830   1024        0        0   1020       20     8066
  50 00A5    165   8116   1024        0        0   1023      114        0
  51 00C1    193   8134   1022       14     8118   1023      114        0
$$COLD_FORTH
  52 0020     32   8136   1024        0        0   1023      114        0
  53 80F4  33012    116   1024        0        0   1024        0        0
  54 00A5    165   8594   1024        0        0   1023      116        0
  55 8083  32899   8612   1022       14     8596   1023      116        0
  56 0012     18   3510   1022       14     8596   1022     8612      116
  57 004E     78   3512   1022       14     8596   1022     8612      116
  58 00EC    236   3518   1020        0        0   1022     8612      116
  59 0096    150   3524   1022       14     8596   1022     8612      116
  60 026D    621   3526   1020        0        1   1022     8612      116
Hello by mind8
  61 0020     32   3528   1024        0        0   1022     8612      116
  62 0020     32   8614   1024        0        0   1023      116        0
  63 801A  32794    118   1024        0        0   1024        0        0
  64 002F     47    106   1024        0        0   1023      118        0
  65 00A5    165   8164   1024        0        0   1023      118        0
  66 00C1    193   8178   1022       10     8166   1023      118        0
実行終り
  67 801B  32795   8180   1024        0        0   1023      118        0
  68 002F     47    110   1024        0        0   1022     8180      118
  69 00A5    165   8138   1024        0        0   1022     8180      118
  70 00C1    193   8160   1022       18     8140   1022     8180      118
実行終り時の処理
  71 0020     32   8162   1024        0        0   1022     8180      118
  72 0012     18   8182   1024        0        0   1023      118        0
  73 004E     78   8184   1024        0        0   1023      118        0
  74 0014     20   8190   1022        0        0   1023      118        0
例外がスローされました: 'Mind8Kernel.Dispatcher.ExitModule' (mind8dispatch.dll の中)
プログラム '[8204] mind8dispatch.dll' がコード 0 (0x0) で終了しました。

とりあえず「空列と」を除けば完走することがわかりました。

つづく

この記事を書いている途中では「空列」がどのようにまずいのかは未確認ですが、Cの空列のターミネーションと現状のC#関数との相性がよろしくないのだと推定しております。次回解決編に乞うご期待?

cconvar.src
空列は         文字列実体 長さ 0。
0
0
3

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?