math.dll

この年になってC言語をやり始めるとは思わなかったよ。なんて言ったりして。
何かを学び始めるのに遅すぎるってことはないよな。
某氏からたきつけられて、C言語を使ってNScripter用のdllを作成してみた。
とりあえず、math.hに入っているような関数をそのままNScripterから使えるようにしてみたものです。また、それを使うためのNScripter側の準備もしてみました。

追記

こっちでも、dllを使ってatan2を実装しました(笑)
こっちのatan2は角度について、-180〜180の範囲で得られる(はず)です。C言語atan2の仕様ってそんな感じだよね?

define_math.txt

numalias math_param1
numalias math_param2
numalias math_result
numalias math_temp1
numalias math_temp2
numalias math_loop
------
------
;==============================
; アークタンジェント2
; 引数は、%角度を受け取る変数,%距離を受け取る変数,%X座標,%Y座標
;==============================
 *atan2
getparam i%math_result,i%math_loop,%math_param1,%math_param2
mov $math_temp1,"math.dll/510&"
itoa $math_param1,%math_param1
itoa $math_param2,%math_param2
add $math_temp1,$math_param1
add $math_temp1,"&"
add $math_temp1,$math_param2
exec_dll $math_temp1
getret %%math_result
getret $math_temp2
atoi %%math_loop,$math_temp2
return
;==============================
; 平方根
; 引数は、%結果を受け取る変数,%平方根を出したい変数
; マイナスの数値を与えた場合、何もしない。
;==============================
 *sqrt
getparam i%math_result,%math_param1
if %math_param1<0 return
if %math_param1=0 mov %%math_result,0:return
mov $math_temp1,"math.dll/512&"
itoa $math_param1,%math_param1
add $math_temp1,$math_param1
exec_dll $math_temp1
getret %%math_result
return
;==============================
; 平方根2
; 結果は1000倍された値になる。それ以外は何も変わらない。
;==============================
 *sqrt2
getparam i%math_result,%math_param1
if %math_param1<0 return
if %math_param1=0 mov %%math_result,0:return
mov $math_temp1,"math.dll/513&"
itoa $math_param1,%math_param1
add $math_temp1,$math_param1
exec_dll $math_temp1
getret %%math_result
return
;==============================
; hypot - ユークリッド距離関数
; 引数は、%結果を受け取る変数,%X座標,%Y座標
; 原点と引数に与えた座標間の距離を返す。
;==============================
 *hypot
getparam i%math_result,%math_param1,%math_param2
mov $math_temp1,"math.dll/514&"
itoa $math_param1,%math_param1
itoa $math_param2,%math_param2
add $math_temp1,$math_param1
add $math_temp1,"&"
add $math_temp1,$math_param2
exec_dll $math_temp1
getret %%math_result
return
;==============================
; hypot2 - ユークリッド距離関数2
; 1000倍された距離を返す。それ以外はhypotと同じ。
;==============================
 *hypot2
getparam i%math_result,%math_param1,%math_param2
mov $math_temp1,"math.dll/515&"
itoa $math_param1,%math_param1
itoa $math_param2,%math_param2
add $math_temp1,$math_param1
add $math_temp1,"&"
add $math_temp1,$math_param2
exec_dll $math_temp1
getret %%math_result
return
;==============================
; 絶対値。引数をそのまま絶対値に変換する。
;==============================
 *abs
getparam i%math_result
if %%math_result < 0 mul %%math_result,(-1)
return
;==============================
; 絶対値。第一引数に第二引数の絶対値を代入する。
;==============================
 *abs2
getparam i%math_result,%math_param1
if %math_param1 < 0 mul %math_param1,(-1)
mov %%math_result,%math_param1
return
;==============================
; 端数切り上げ割り算
;==============================
 *div2
getparam i%math_result,%math_param1
if %math_param1=0 inc %math_param1
mov %math_temp1,%%math_result mod %math_param1
div %%math_result,%math_param1
notif %math_temp1=0 inc %%math_result
return

使い方

汎用ライブラリ・define_math.txt - 永字八法の焼き直しなのであんまり変わってない。

  • atan2
  • sqrt
  • sqrt2
  • hypot
  • hypot2

の五つを追加する。

ノート

某氏から「string.hが混じってる……」と指摘を受けたので、文字列関係の命令は別に切り出すことにした。