はじめに
こちらの記事「Mind8のランタイムディスパッチャC実装の代替実装をC#で行う(zzNotif)」へMind開発者の@killyさんより重要な情報共有がございまして、本記事はそのご提供情報の検証記事となります。
killyさんよりご提供いただいた重要な情報の内容とは、うまくまとまっていませんが本記事の件名のとおりでございます。興味を持たれた方は該当記事のkillyさんのコメントもご参照ください。
前提条件
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
2つのVSCode環境
ちょっと紛らわしいのですが、本記事に関連しては2つのVSCode環境がございます。
- 1つは、Cで実装されているMind8kernelの動作をデバッグ実行で探るためのこちらの記事の環境
- 2つめは、そのMind8kernelのディスパッチャをC#で代替実装しようという試みのこちらの記事の環境
となります。
2つのVSCode環境を使った本記事作業のおおまかな流れ
本記事ではMind8のCランタイムディスパッチャ起動検証用Consoleのビルド環境として1つめを使います。こちらはランタイムのカスタマイズ環境としてMind8のランタイムソースが具備されています。
そして、ビルドされた検証用Consoleを使って、C#代替実装検証用の中間コードhello.mcoを2つめの環境でビルドします。
そしてさらに、この検証用ConsoleでリビルドされたC#代替実装検証用の中間コードhello.mcoを1つめの環境にコピーして、短縮されたスタートアップでのディスパッチャの動きを確認します。
検証用Consoleのビルド
killyさんよりご提供いただいた情報に従い、下記のように検証用Consoleのビルド用のフォルダfiledummyを作成します。
ビルド用フォルダ構成
下図の.vscodeフォルダの位置からわかりますようにMind8kernelのデバッグ実行時はkernelフォルダを作業ルートにVSCodeを起動しますが、Mind8でビルドするだけの場合はMind8フォルダを作業ルートにして起動します。
C:\developments\vscode\mind8>tree
C:.
├─bin
├─file
│ └─obj
├─filedummy
│ └─obj
├─kernel
│ └─.vscode
├─lib
├─libY
└─sample
filedummyフォルダには下記のようなファイルを格納します。
consdumy.srcはfileフォルダより、asmword.*はfile/objフォルダよりコピーします。batファイル2つはkillyさん情報による新規作成です。
C:\developments\vscode\mind8\filedummy>tree /f
C:.
│ ccond.bat
│ ccond0.bat
│ consdumy.src
│
└─obj
asmword.his
asmword.mco
asmword.sym
ビルド実行
ビルドの実行はccond0.batを実行します。Mind8コンパイラへのパスは通しておきます。
C:\developments\vscode\mind8\filedummy>mind
日本語プログラミング言語 Mind Version 8.07 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
Usage(1): mind -help (オプション詳細を表示)
Usage(1): mind source library [objectdir\][objfile]
C:\developments\vscode\mind8\filedummy>ccond0.bat
日本語プログラミング言語 Mind Version 8.07 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 ..「$$SLITERAL_EVEN」:
【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 ASM .. 送り検=無し
ロケーション=00000000 インデックス=00A5 式演算番号=0
「$$SLITERAL_ODD」:
【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 ASM .. 送り検=無し
ロケーション=00000000 インデックス=00A4 式演算番号=0
「$$JMP_NEAR」:
【雑単語の未定義語】module=0 (データ型不使用) 値=00000000
「$$JMP_FAR0」:
【雑単語の未定義語】module=0 (データ型不使用) 値=00000000
「$$EXIT1W」:
【雑単語の未定義語】module=0 (データ型不使用) 値=00000000
「$$COLD_FORTH」:
【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 仮定義 .. 送り検=無し
ロケーション=00000064 インデックス=0019 式演算番号=0
「$$COLD_USER」:
【雑単語の未定義語】module=0 (データ型不使用) 値=00000000
「$$対話モード?」:
【雑単語の未定義語】module=0 (データ型不使用) 値=00000000
「$$TRAP2_ENTRY」:
【雑単語の未定義語】module=0 (データ型不使用) 値=00000000
「プロセス終り0」:
【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 ASM .. 送り検=無し
ロケーション=00000000 インデックス=0014 式演算番号=0
「実行終り時の処理」:
【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 仮定義 .. 送り検=無し
い型=数値扱 整数入力 整数出力 ASM .. 送り検=無し
ロケーション=00000000 インデックス=00C1 式演算番号=0
「$$改行」:
【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 ASM .. 送り検=無し
ロケーション=00000000 インデックス=00C4 式演算番号=0
終了
C:\developments\vscode\mind8\filedummy>
consdumyのオブジェクトライブラリファイルが生成されていることを確認します。
C:\developments\vscode\mind8\filedummy>dir obj\consdumy.*
2024/05/12 11:49 309 consdumy.his
2024/05/12 11:49 898 consdumy.mco
2024/05/12 11:49 20,084 consdumy.sym
3 個のファイル 21,291 バイト
ここまででMind8のCランタイムディスパッチャ起動検証用Consoleのビルドは完了です。
検証用Consoleライブラリを使った検証用中間コードのリビルド
正規のスタートアップルーチンを起動する中間コードファイルと区別するため、ソースコードファイル名を下記のように変更します。
hello.src → hellodummy.src
C:\developments\vscode\mind8dispatch>dir *.src
2024/04/18 20:49 56 hello.src
2024/05/12 11:55 56 hellodummy.src
2 個のファイル 112 バイト
お題のMind8のソースファイル
メインとは
「Hello by mind8」を 表示すること。
ビルド実行
横スクロールしてわかりずらいですが、こちらはC#用環境のため、Mind8コンパイラのライブラリ指定パスにはさきほどのC用環境の上にあるfiledummy\objフォルダのconsdumyを指定します。
C:\developments\vscode\mind8dispatch>mind hellodummy C:\developments\vscode\mind8\filedummy\obj\consdumy
日本語プログラミング言語 Mind Version 8.07 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
1 個のエラーが有ります。
ここでエラーとなります。これは「表示」する単語が検証用コンソールでは未定義のためです。
hellodummy.src 2 行目でエラー。行内容は、
「Hello by mind8」を 表示すること。
要因1:"表示"は未定義の単語です。
1 個のエラーが有ります。
お題のMind8のソースファイル(訂正版)
お題のソースを下記のように訂正します。
メインとは
「Hello by mind8」を $$表示すること。
ビルド実行(訂正版)
こんどは無事にビルド成功しました!
C:\developments\vscode\mind8dispatch>mind hellodummy C:\developments\vscode\mind8\filedummy\obj\consdumy
日本語プログラミング言語 Mind Version 8.07 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> hellodummy.exe
無事に新しい中間コードファイルhellodummy.mcoファイルも生成されています。
C:\developments\vscode\mind8dispatch>dir hellodummy.*
2024/05/12 13:06 74,752 hellodummy.exe
2024/05/12 13:06 402 hellodummy.his
2024/05/12 13:06 938 hellodummy.mco
2024/05/12 13:06 60 hellodummy.src
2024/05/12 13:06 19,048 hellodummy.sym
5 個のファイル 95,200 バイト
ただし、こちらの環境での実行ではこれまでの検証の影響でランタイムシリアルNo不整合エラーとなりますが、ここでは問題にしません。
C:\developments\vscode\mind8dispatch>hellodummy
kermain: Serial number missmatch.
C側検証環境でhellodummy.mcoでのスタートアップ処理を検証するため、hellodummy.mcoをmindexec.mcoにリネームしてC側検証環境のkernelフォルダにコピーします。下図は従来の正規のスタートアップのhello.mcoがリネームされたmindexec.mcoです。
C:\developments\vscode\mind8\kernel>dir mindexec.mco
2024/04/18 20:53 43,544 mindexec.mco
1 個のファイル 43,544 バイト
ではコピーします。
C:\developments\vscode\mind8dispatch>copy hellodummy.mco C:\developments\vscode\mind8\kernel\mindexec.mco
C:\developments\vscode\mind8\kernel\mindexec.mco を上書きしますか? (Yes/No/All):
Y
1 個のファイルをコピーしました。
だいぶファイルサイズが小さくなりました
C:\developments\vscode\mind8\kernel>dir mindexec.mco
2024/05/12 13:06 938 mindexec.mco
1 個のファイル 938 バイト
お題のMind8の中間コード実行リスト
C側検証環境で、前記手順でコピーしたお題の中間コードファイルをディスパッチャで処理させます。
下図はオリジナルのC実装のディスパッチャモニタ関数に対して出力情報を追加したモニタ関数を実行しているため少しわかりづらくなっていますが、左端から1列目がディスパッチャが処理したステップ数、2列目が16進数表記のmcode、3列目が10進数表記のmcode、4列目がデータスタックのアドレスポインタ変数のオフセット値などとなっています。
1 8019 32793 1024 0 0 0 0 0 0 1024 0 0
2 002F 47 1024 0 0 0 0 0 0 1023 0 0
3 00A5 165 1024 0 0 0 0 0 0 1023 0 0
4 00C1 193 1022 14 6889596 0 0 0 0 1023 14 0
$$COLD_FORTH
5 0020 32 1024 0 0 0 0 0 0 1023 0 0
6 8029 32809 1024 0 0 0 0 0 0 1024 0 0
7 00A5 165 1024 0 0 0 0 0 0 1023 0 0
8 00C1 193 1022 14 6890092 0 0 0 0 1023 14 0
Hello by mind8
9 0020 32 1024 0 0 0 0 0 0 1023 0 0
10 801A 32794 1024 0 0 0 0 0 0 1024 0 0
1022 0 6889582
16 00A5 165 1024 0 0 0 0 0 0 1022 0 6889582
17 00C1 193 1022 18 6889618 0 0 0 0 1022 18 6889582
実行終り時の処理
18 0020 32 1024 0 0 0 0 0 0 1022 0 6889582
19 004D 77 1024 0 0 0 0 0 0 1023 0 0
20 0014 20 1022 0 0 0 0 0 0 1023 0 0
お題の「Hello by mind8」のコンソール出力までは7(同一コード含む)のmcodeを処理すればよいことがあかりました!!
お題のMind8の中間コード実行リスト(正規のスタートアップ)
こちらの記事に正規のスタートアップのMCodeをC版オリジナルがディスパッチしたリストを確認しています。お題の「Hello by mind8」のコンソール出力までは649(同一コード含む)のmcodeを処理します。
つづく
生成されたhello.mcoを解釈して、C#側で「Hello by mind8」が出力されるようにするまでの長い道のりですが、とりあえず構想段階のソースコードの確度をざくっと引き上げて「三段目」とかかなという感じでしたが、最近は道の険しさにひるんでいました。54/649みたいな状況。@killyさんの情報ご提供でいったんは完走させる近道があることがわかって少し安心したところです。killyさんに重ねてお礼申し上げます。