なんか、上記の答えでうまくいかないようなので四則演算の内、足し算と引き算のみと
雑用関数などをモジュール化してみました。
; LONGLONG 計算モジュール(四則演算と一部の雑用関数)
#module "calc64"
; LONGLONG の上位 32 ビットを取得
#defcfunc HILONG double d, local tmp
tmp = strf("%016I64x", d)
return int("$" + strmid(tmp, 0, 8))
; LONGLONG の下位 32 ビットを取得
#defcfunc LOLONG double d, local tmp
tmp = strf("%016I64x", d)
return int("$" + strmid(tmp, 8, 8))
; LONGLONG を作成
#defcfunc MAKELONGLONG int p1, int p2, local v
ddim v, 1
lpoke v, 4, p1
lpoke v, 0, p2
return v
; LONGLONG の計算実行(マシン語)
#deffunc runmcn var v1, int func, double d1, double d2, local prm, local ret
ddim v1, 1
prm = varptr(v1), LOLONG(d1), HILONG(d1), LOLONG(d2), HILONG(d2)
ret = callfunc(prm, func, 5)
return
; LONGLONG の足し算
#defcfunc add64 double d1, double d2, local func, local ret
; void add64(LONGLONG *llv, LONGLONG llv2, LONGLONG llv3)
; {
; *llv = llv2 + llv3;
; return;
; }
func(0) = 0x8bec8b55, 0x558b0c4d, 0x144d0310, 0x1308458b
func(4) = 0x08891855, 0x5d045089, 0x000000c3
runmcn ret, varptr(func), d1, d2
return ret
; LONGLONG の引き算
#defcfunc sub64 double d1, double d2, local func, local ret
; void sub64(LONGLONG *llv, LONGLONG llv2, LONGLONG llv3)
; {
; *llv = llv2 - llv3;
; return;
; }
func(0) = 0x8bec8b55, 0x558b0c4d, 0x144d2b10, 0x1b08458b
func(4) = 0x08891855, 0x5d045089, 0x000000c3
runmcn ret, varptr(func), d1, d2
return ret
; LONGLONG のかけ算(未完成)
/*
#defcfunc mul64 double d1, double d2, local func, local ret
; void mul64(LONGLONG *llv, LONGLONG llv2, LONGLONG llv3)
; {
; *llv = llv2 * llv3;
; return;
; }
func(0) = 0xffec8b55, 0x75ff1875, 0x1075ff14, 0xe80c75ff
func(4) = 0x00000000, 0x89084d8b, 0x04518901, 0x0000c35d
runmcn ret, varptr(func), d1, d2
return ret
*/
; LONGLONG の割り算(未完成)
/*
#defcfunc div64 double d1, double d2, local func, local ret
; void div64(LONGLONG *llv, LONGLONG llv2, LONGLONG llv3)
; {
; *llv = llv2 / llv3;
; return;
; }
func(0) = 0xffec8b55, 0x75ff1875, 0x1075ff14, 0xe80c75ff
func(4) = 0x00000000, 0x89084d8b, 0x04518901, 0x0000c35d
runmcn ret, varptr(func), d1, d2
return ret
*/
#global
v = MAKELONGLONG(0, 0xffffffff)
mes strf("%I64u", add64(v, v))
v = MAKELONGLONG(0xff, 0xffffffff)
mes strf("%I64u", sub64(v, MAKELONGLONG(1, 0)))
; mes strf("%I64u", mul64(v, MAKELONGLONG(0, 2)))
; mes strf("%I64u", div64(v, MAKELONGLONG(0, 2)))
stop
ポイントはdouble型(64bit)を裏技的に使用しているところです。
かけ算と割り算は結構難しそうなので勘弁してください。
だれか代わりに修正してくれないかな〜。(^^ゞ
こんな事やるくらいならプラグイン作った方が早くて簡単なような気もしますけど。