はじめに
諸般の流れから日本語プログラミング言語Mindで固定小数点計算機能を書いてみようかなと思い立ち、Mind開発者の@killyさんのご支援をいただきつつMind8のkernelの修正実行に挑戦中の続きです。
前回で独自のソールファイル5kerD.cへの倍精度整数(64bit整数)の変数初期化処理を実装しましたので、今回はそのエラー処理です。もしも本記事の内容をお試ししたい場合は諸般の事情でMind7のライセンスが必要となりますのでご注意ください。
前提条件
Windows11 Pro 22H2
VSCode(Visual Studo Code) 1.86.1
Microsoft Visual C++ 2008 Express Edition
Mind Version 7.5 for Windows
Mind Version 8.07 for Windows
MindはMind8のバージョンのパスが構成されていることを前提とします。
VSCodeの拡張機能
C/C++ for Visual Studio Code 1.18.5 Microsoft
C/C++ Extension Pack 1.3.0 Microsoft
C/C++のデバッガはMind8のCカーネルアプリケーションをデバッグ実行するために使用しています。
お題のソースコード C関数
compword.c
スタックプッシュ関数push_quad2()が追加されています。こちらの記事を参照してください。
other.c
other.cの内容をすべてダミー定義とします。正規のMind8ソースでは「f余り」が定義されていますが、辞書の順序の関係からその単語は5kerD.cの冒頭に引越ししています。こちらの記事を参照してください。
kerbody.c
kerbody.cでother.cのインクルードの直前に5kerD.cをインクルードするように追記しています。こちらの記事を参照してください。
5kerD.c
独自に追加しているソースファイルです。「q文字列初期化」を下記のように書き換えました。
/*;GLOBAL*/
//~略~
PRIVATE void
qmojiretuShokika( void ) /* ;WORD q文字列初期化 .S */
{
ULONG count;
UCHAR *addr;
word64 long1;
int flg;
char *endptr;
/* (string → long1) */
count = POP_C;
addr = POP_A;
flg = 0;
_set_errno(0);
long1=_strtoi64(addr,&endptr,10);//_strtoi64 Microsoft 固有
flg = errno;
_set_errno(0);
if( *endptr != '\0' ){
flg = 1;
}
if(flg!=0){
PUSH_S( addr, count );
zzHot10(); /* 重大エラー処理に飛ぶ */
}
push_quad2(long1);
}
//~略~
/* end of '5kerD.c' */
ソースコード全文
「q文字列初期化」以外は変更ありませんので、前回記事をご参照ください。
Mind7ツールでc_words修正ビルド
前回記事をご参照ください。
Mind8ツールでfile修正ビルド
fileライブラリを修正ビルドする前に、下記のエラー定義ファイルにエラー処理を追記します。 HOT9とHOT4の間にHOT10の本定義を追加します。
※~略~
条件コンパイル WindowsGUI環境・非SILENT。
$$HOT9とは 本定義 (Tcl/Tk文法エラー)
静かに重大エラー。
条件コンパイル終り。
$$HOT10とは 本定義 (倍精度変数初期化エラー)
_バッファは 文字列実体 長さ 512桁
「倍精度変数を初期化できませんでした。初期化文字列(」を _バッファに 入れ
_バッファに 追加し
「)」を _バッファに 追加し
_バッファで 重大エラー。
$$HOT4は 本定義 (INDEX OVERFLOW)
※~略~
ここからはMind8のツール、コンパイラを使用します。
シリアル番号チェッカーツール
Mind開発者の@killyさんからMind8ランタイムのシリアル番号チェッカーツールをご提供いただいています。(この記事参照)
今回は開発環境内での変更のため前回のカウントアップ値を保持しますので、ランタイムのシリアル番号チェッカツールは実行しません。
fileライブラリをリビルド
fileライブラリをリビルドして開発環境のlibフォルダにコピーします。
C:\developments\vscode\mind8\kernel>cd ../file
C:\developments\vscode\mind8\file>mmake obj\file mind
C:\developments\vscode\mind8\file>mcpC -puv obj\file.mco obj\file.sym ..\lib
obj\file.mco -> ..\lib
obj\file.sym -> ..\lib
nmake all
nmake allをターミナルのタスクから実行します。
* 実行するタスク: nmake all
ここで追加した関数のC言語的に問題がある場合はエラーで終了することがありますので注意します。
nmake install
nmake allが成功した場合はnmake installも実行しておきます。
* 実行するタスク: nmake install
kernel.exeをmrunt010.exeにリネームしてbinフォルダコピー
開発環境のbinフォルダにkernel.exeをリネームしたmrunt010.exeに手動でコピーしておきます。
C:\developments\vscode\mind8>copy bin\kernel.exe bin\mrunt010.exe
1 個のファイルをコピーしました。
お題のソースコード Mind
今回はint64_2の方に符号付き64bit整数の最大値を超える数字を与えてみます。正常に実行されている部分も確認するため、int64の方には従来値を設定しておきます。
int64は 倍精度変数。
int64_2は 倍精度変数。
メインとは
"175921860444158"を q文字列初期化し int64に 入れ
"int64 (q文字列初期化) "を 表示し
int64を $$クアド表示し " "を 表示し int64を $$倍精度表示し 改行し
"9223372036854775808"を q文字列初期化し int64_2に 入れ
"int64_2 (q文字列初期化) "を 表示し
int64_2を $$クアド表示し " "を 表示し int64_2を $$倍精度表示し 改行し
。
正規のMind8のfileライブラリではなく、今回リビルドしたfileライブラリを指定してコンパイルします。またMindコンパイラも正規のバージョンではなく、開発環境のbinパスのmindを実行します。
PS C:\developments\vscode\mind8> bin\mind sample\quaderr lib\file
日本語プログラミング言語 Mind Version 8.07 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\developments\vscode\mind8\bin\mindex.exe --> sample\quaderr.exe
実行結果
正規のバージョンのMind8のランタイムとはシリアルNoが異なっていますので、開発環境のランタイムで動作するようbinフォルダに移動してから、ビルドされたquaderr.exeを実行します。
C:\developments\vscode\mind8>cd bin
C:\developments\vscode\mind8\bin>..\sample\quaderr
int64 (q文字列初期化) FFFFFFFE|00009FFF 175921860444158
倍精度変数を初期化できませんでした。初期化文字列(9223372036854775808)
無事にエラーメッセージが表示されました!
おわりに
なんども記事のおわりで「いよいよ本丸の固定小数点に迫っていきます。」とか書きましたが、属性定義の件はオイオイ検証していくとして、次回はいよいよ倍精度変数を固定小数点型(小数部4桁固定の簡易通貨型のようなもの)に初期化する関数を対応してみます?