こちらの記事にてMind開発者の@killyさんより情報共有いただいたMind8のCランタイムディスパッチャ起動検証用Consoleでリビルドした中間コードhellodummy.mcoを使ってC#代替実装版はいったん完走の日の目を見ることができました。そして、引き続き前回記事にて正規版のConsoleでビルドした中間コードhello.mcoに対する処理の続きを行ってみたのですが、やはり処理しなければならないmcodeの数の多さにくらくらしてしまいました。(正規版は終了までのmcode数は694、起動検証用では20)
そこで本記事では正規版の694と、起動検証用の20との間狙いで、段階的に終了までの検証ステップ数を増やしていくようなカスタムビルドができないものか、検討検証してみました。
前提条件
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環境がございます。
お手数ですが、検証用Consoleをビルドした際のこちらの記事もご参照ください。
2つのVSCode環境を使った本記事作業のおおまかな流れ
本記事ではMind8のCランタイムディスパッチャConsoleのカスタマイズビルド環境として1つめを使います。こちらはランタイムのカスタマイズ環境としてMind8のランタイムソースが具備されています。
そして、ビルドされたカスタマイズConsoleを使って、C#代替実装検証用の中間コードhello.mcoを2つめの環境でビルドします。今回はhellolevel1とします。
そしてさらに、このカスタマイズConsoleでリビルドされたC#代替実装検証用の中間コードhellolevel1.mcoを1つめの環境にコピーして、カスタマイズ短縮されたスタートアップでのディスパッチャの動きを確認します。
カスタマイズConsoleのビルド
killyさんよりご提供いただいた情報に従い、下記のようにカスタマイズConsoleのビルド用のフォルダfilelevel1を作成します。
ビルド用フォルダ構成
filedummyフォルダは起動検証用Consoleのビルド環境です。今回はそれと併存してfilelevel1フォルダを作成します。fileフォルダは正規のソースファイルが格納されたフォルダです。今回はこちらのソースも参照します。
C:\developments\vscode\mind8>tree
C:.
├─bin
├─file
│ └─obj
├─filedummy
│ └─obj
├─filelevel1
│ └─obj
├─kernel
│ └─.vscode
├─lib
├─libY
└─sample
fileleve1lフォルダには下記のようなファイルを格納します。
conslevel1.srcはfileフォルダよりコピーしたconsdumy.srcを編集します。asmword.*はfile/objフォルダよりコピーします。batファイルは新規作成です。リビルド用バッチは割愛しています。
C:\developments\vscode\mind8\filelevel1>tree /f
C:.
│ cconlv10.bat
│ conslevel1.src
│
└─obj
asmword.his
asmword.mco
asmword.sym
お題のMindソースコード
カスタマイズConsoleのconslevel1.srcを起動検証用Consoleのconsdumy.srcに対して正規版ConsoleのConsole.srcから必要部分だけもってきて、下記のように編集します。
スプーリングアドレスは 変数。
入力文字補正アドレスは 変数。
※検索機能初期化アドレスは 変数。
※検索機能終了アドレスは 変数。
グローバル。
"../file/osdefine.src"を コンパイルする。 (DOS/UNIXの指定)
"../file/cswitch.src"を コンパイルする。 (コンパイルスイッチ)
"../file/ckaridef.src"を コンパイルする。 (仮定義)
"../file/cconvar.src"を コンパイルする。 (大域定数/大域変数)
"../file/cerrmsg.src"を コンパイルする。 (エラー定数/エラー登録)
"../file/cconv.src"を コンパイルする。 (数値/文字列変換)
"../file/coutput.src"を コンパイルする。 (Pureな表示系)
"../file/cerror.src"を コンパイルする。 (エラー処理)
ローカル。
立ち上がり要求は ワード変数。
立ち下がり要求は ワード変数。
コンソール初期化・基本部とは (・ → ・)
(しばらくはシステムコールするな)
終了パラメータを クリアし ※CCONST.SRC
エラー文字列初期化し ※CERROR.SRC
空白文字列初期化し ※COUTPUT.SRC
。
各ライブラリ初期化とは 本定義 (・ → ・)
コンソール初期化・基本部し ※本ソース
。
グローバル。
$$COLD_FORTHは 本定義
(プログラム起動時のみの処理)
立ち上がり要求を セットし
立ち下がり要求を クリアし
(ライブラリ初期化処理)
各ライブラリ初期化し ※本ソース
「各ライブラリ初期化後」で このメッセージでスタック検査し
「$$COLD_FORTH&改行&」を $$表示。
実行終り時の処理は 本定義
「実行終り時の処理&改行&」を $$表示すること。
実行終りは 本定義
「実行終り&改行&」を $$表示し
実行終り時の処理し
終了パラメータで プロセス終り0。
? $$SLITERAL_EVEN。
? $$SLITERAL_ODD。
? $$JMP_NEAR。
? $$JMP_FAR0。
? $$EXIT1W。
? $$COLD_FORTH。
? $$COLD_USER。
? $$対話モード?。
? $$TRAP2_ENTRY。
? プロセス終り0。
? 実行終り時の処理。
? 実行終り。
? $$表示。
? $$改行。
※改ページ
$$HOT3は 本定義 (ZERO DIVIDE ERROR)
「ゼロで除算しました。」で 重大エラー。
$$HOT4は 本定義 (INDEX OVERFLOW)
(次のMコードロケ、配列先頭ロケ、異常番号(32)、全要素数(16)、種別(16) → ・)
次のMコードロケーションは 変数
配列先頭ロケーションは 変数
異常番号は 変数
全要素数は ワード変数
種別は ワード変数
次のMコードロケーションと 配列先頭ロケーションと
異常番号と 全要素数と 種別に 入れ
「要素番号が異常です。&0D0A&」を $$表示し
「次のMコードロケーション=」を $$表示し
次のMコードロケーションを $$ダブル表示し $$改行し
「配列先頭ロケーション =」を $$表示し
配列先頭ロケーションを $$ダブル表示し $$改行し
「配列種別=」を $$表示し
種別を $$ニブル表示し
「 異常要素番号=」を $$表示し
異常番号を $$ダブル表示し
「 有効要素数=」を $$表示し
全要素数を $$ワード表示し
「」で 重大エラー。
$$HOT5は 本定義 (先行入力文字積み)
「$$HOT5(先行入力要求)=」を $$表示し
$$ワード表示し $$改行。
$$HOT6は 本定義 (ブレーク処理)
「$$HOT6(ブレーク検査要求)=」を $$表示し
$$ワード表示し $$改行。
$$HOT16は 本定義 (NOT_NUMBER_ERROR)
「数値でないデータを与えました。」で 重大エラー。
$$HOT17は 本定義 (NOT_STRING_ERROR)
「文字列でないデータを与えました。」で 重大エラー。
※ 終り(CONSDUMY.SRC) ※
$$COLD_FORTHの内容を「各ライブラリ初期化」まで正規版Consoleと同じとして、さらに「各ライブラリ初期化」の中身も「コンソール初期化・基本部」までとし、そしてさらに「コンソール初期化・基本部」の中身も「空白文字列初期化し」までとして、正規版の実装から各所後半を大幅にカットしています。
サブソースはファイル名にfileフォルダへの相対パス情報を追記しています。また正規版のConsoleより一部カットしています。
ビルド実行
ビルドの実行はcconlv10.batを実行します。
@mind conslevel1.src obj\asmword obj\ -local
Mind8コンパイラへのパスは通しておきます。
C:\developments\vscode\mind8>c:\pmind\usemind
myfolder=pmind\
myfolder=pmind
newpath=[]
Mindの開発環境を設定しました。
c:\pmind>cd c:\developments\vscode\mind8\filelevel1
c:\developments\vscode\mind8\filelevel1>cconlv10.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 扱い型=数値扱 整数入力 整数出力 仮定義 .. 送り検=無し
ロケーション=0000006C インデックス=001B 式演算番号=0
「実行終り」:
【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 仮定義 .. 送り検=無し
ロケーション=00000068 インデックス=001A 式演算番号=0
「$$表示」:
【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 ASM .. 送り検=無し
ロケーション=00000000 インデックス=00C1 式演算番号=0
「$$改行」:
【処理単語の純処理単語】module=1 扱い型=数値扱 整数入力 整数出力 ASM .. 送り検=無し
ロケーション=00000000 インデックス=00C4 式演算番号=0
終了
conslevel1のオブジェクトライブラリファイルが生成されていることを確認します。
c:\developments\vscode\mind8\filelevel1>dir obj\conslevel1.*
2024/05/19 17:47 760 conslevel1.his
2024/05/19 17:47 7,994 conslevel1.mco
2024/05/19 17:47 24,064 conslevel1.sym
3 個のファイル 32,818 バイト```
ここまででMind8のCランタイムディスパッチャのカスタマイズ版Consoleのビルドは完了です。
カスタマイズ版Consoleライブラリを使った中間コードのリビルド
正規のスタートアップルーチンを起動する中間コードファイルと区別するため、ソースコードファイル名を下記のように変更します。
hello.src → hellolevel1.src
C:\developments\vscode\mind8dispatch>dir *.src
2024/04/18 20:49 56 hello.src
2024/05/12 13:06 60 hellodummy.src
2024/05/19 15:24 56 hellolevel1.src
3 個のファイル 172 バイト
お題のMind8のソースファイル
メインとは
「Hello by mind8」を 表示すること。
ビルド実行
横スクロールしてわかりずらいですが、こちらはC#用環境のため、Mind8コンパイラのライブラリ指定パスにはさきほどのC用環境の上にあるfilelevel1\objフォルダのconslevel1を指定します。
C:\developments\vscode\mind8dispatch>mind hellolevel1 c:\developments\vscode\mind8\filelevel1\obj\conslevel1
日本語プログラミング言語 Mind Version 8.07 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> hellolevel1.exe
無事に新しい中間コードファイルhellolevel1.mcoファイルも生成されています。
起動検証用Consoleのhellodummy.mcoのサイズのおよそ9倍という状態のようです。それでも正規版のサイズに対しては1/5より小さいです。
C:\developments\vscode\mind8dispatch>dir hello*.mco
2024/04/18 20:53 43,544 hello.mco
2024/05/12 13:06 938 hellodummy.mco
2024/05/19 15:37 8,034 hellolevel1.mco
3 個のファイル 52,516 バイト
C側検証環境でhellolevel1.mcoでのスタートアップ処理を検証するため、hellolevel1.mcoをmindexec.mcoにリネームしてC側検証環境のkernelフォルダにコピーします。
C:\developments\vscode\mind8dispatch>copy hellolevel1.mco C:\developments\vscode\mind8\kernel\mindexec.mco
C:\developments\vscode\mind8\kernel\mindexec.mco を上書きしますか? (Yes/No/All):
Y
1 個のファイルをコピーしました。
お題のMind8の中間コード実行リスト
C側検証環境で、前記手順でコピーしたお題の中間コードファイルをディスパッチャで処理させます。
SqNo mcode mc(dec) mpoint dtp.point dtp+0 dtp+1 rtp.point rtp+0 rtp+1
1 8019 32793 57 1024 0 0 1024 0 0
2 002F 47 51 1024 0 0 1023 0 0
3 0012 18 2931 1024 0 0 1023 0 0
4 0036 54 2932 1024 0 0 1023 0 0
5 0080 128 2935 1024 0 0 1023 0 0
6 0036 54 2936 1024 0 0 1023 0 0
7 0070 112 2939 1024 0 0 1023 0 0
8 803A 32826 2940 1024 0 0 1023 0 0
9 002F 47 119 1024 0 0 1022 0 13385794
10 80B8 32952 2929 1024 0 0 1022 0 13385794
11 0012 18 2921 1024 0 0 1021 0 13391560
12 0036 54 2922 1024 0 0 1021 0 13391560
13 0071 113 2925 1024 0 0 1021 0 13391560
14 8046 32838 2926 1024 0 0 1021 0 13391560
15 8045 32837 163 1024 0 0 1020 0 13391538
16 0012 18 157 1024 0 0 1019 0 13391532
17 0036 54 158 1024 0 0 1019 0 13391532
18 0074 116 161 1024 0 0 1019 0 13391532
19 0020 32 162 1024 0 0 1019 0 13391532
20 0020 32 164 1024 0 0 1020 0 13391538
21 80A3 32931 2927 1024 0 0 1021 0 13391560
22 0036 54 1942 1024 0 0 1020 0 13391538
23 0012 18 1945 1024 0 0 1020 0 13391538
24 016E 366 1946 1024 0 0 1020 0 13391538
25 0020 32 1949 1024 0 0 1020 0 13391538
26 0020 32 2928 1024 0 0 1021 0 13391560
27 0020 32 2930 1024 0 0 1022 0 13385794
28 00A5 165 2941 1024 0 0 1023 0 0
29 803C 32828 2953 1022 20 13391564 1023 20 0
30 002F 47 123 1022 20 13391564 1022 20 13385794
31 001A 26 2901 1022 20 13391564 1022 20 13385794
32 006E 110 2902 1022 20 13391564 1020 20 13391538
33 0015 21 2904 1024 0 0 1020 0 13391564
34 00ED 237 2905 1022 0 1 1020 0 13391564
35 0022 34 2915 1024 0 0 1020 0 13391564
36 00A5 165 2954 1024 0 0 1023 0 0
37 00C1 193 2963 1022 14 13391590 1023 14 0
$$COLD_FORTH
38 0020 32 2964 1024 0 0 1023 0 0
39 80C3 32963 58 1024 0 0 1024 0 0
40 00A5 165 3193 1024 0 0 1023 0 0
41 8083 32899 3202 1022 14 13392068 1023 14 0
42 0012 18 1755 1022 14 13392068 1022 14 13385796
43 004E 78 1756 1022 14 13392068 1022 14 13385796
44 00EC 236 1759 1020 0 0 1022 0 13385796
45 0096 150 1762 1022 14 13392068 1022 14 13385796
46 026D 621 1763 1020 0 1 1022 0 13385796
Hello by mind8 47 0020 32 1764 1024 0 0 1022 0 13385796
48 0020 32 3203 1024 0 0 1023 0 0
49 801A 32794 59 1024 0 0 1024 0 0
50 002F 47 53 1024 0 0 1023 0 0
51 00A5 165 2978 1024 0 0 1023 0 0
52 00C1 193 2985 1022 10 13391638 1023 10 0
実行終り
53 801B 32795 2986 1024 0 0 1023 0 0
54 002F 47 55 1024 0 0 1022 0 13385798
55 00A5 165 2965 1024 0 0 1022 0 13385798
56 00C1 193 2976 1022 18 13391612 1022 18 13385798
実行終り時の処理
57 0020 32 2977 1024 0 0 1022 0 13385798
58 0012 18 2987 1024 0 0 1023 0 0
59 004E 78 2988 1024 0 0 1023 0 0
60 0014 20 2991 1022 0 0 1023 0 0
お題の「Hello by mind8」のコンソール出力までは46(同一コード含む)のmcodeを処理すればよいことがわかりました!!終了までは60ステップです。
つづく
正規版Consoleの中間コードではステップ56くらいまでは進行しており、お題のコンソール出力後の終了処理は起動検証用Consoleの中間コードで完走していますので、もしかしたらこの状態の場合は現状でも完走するかもしれません。