LoginSignup
2
0

Mind8で倍精度整数の変数初期化処理を実装してみる(cerror.srcにエラー処理追加)

Last updated at Posted at 2024-03-25

はじめに

諸般の流れから日本語プログラミング言語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文字列初期化」を下記のように書き換えました。

5kerD.c
/*;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の本定義を追加します。

cerror.src
※~略~
  条件コンパイル 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の方には従来値を設定しておきます。

quaderr.src
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)

無事にエラーメッセージが表示されました!:tada::tada:

おわりに

なんども記事のおわりで「いよいよ本丸の固定小数点に迫っていきます。」とか書きましたが、属性定義の件はオイオイ検証していくとして、次回はいよいよ倍精度変数を固定小数点型(小数部4桁固定の簡易通貨型のようなもの)に初期化する関数を対応してみます?

2
0
4

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