解決策を示すの忘れてました。
ようはhscallbkを使わずに、終了を検知すればいいので以下の方法で良いと思います。
#runtime "hsp3cl"
#include "hsp3clmod.as"
#include "longint.hsp"
#include "d3m.hsp"
#module
#deffunc IsPrimeLocal var D
f=0
A=D*D
B=(D+1)*(D+1)
*pe
if IsPrime(A)=1:f=1:return f
A++
if A!B:goto *pe
return f
#global
#include "kernel32.as"
#define CTRL_C_EVENT 0
#define CTRL_BREAK_EVENT 1
#define CTRL_CLOSE_EVENT 2
#uselib ""
#func HandlerRoutine "" int
#module
#deffunc __cleanup onexit
gosub *lb_cleanup@
return
#global
//追加
proc=$000001b8,$0000a300,$04c20000,$00000000
lpoke proc,6,varptr(endflag)
VirtualProtect varptr(proc),16,0x40,varptr(endflag)
endflag=0
SetConsoleCtrlHandler varptr(proc), 1
clInit
clclear
clSetCursor -1
clWidth 80,15
notesel M
randomize
noteload "Prime_n.txt"
C=longint(M)-10
mes
mes " Investigation will start."
mes
D=d3timer()+1000
*Enter
//gm_String@ =str(C)
gosub *endchk //追加
val=d3getfps()
C++
IsPrimeLocal C
if stat = 1{
if d3timer()>=D{
clpos 0,3
mes " n^2= "+C*C
mes
mes " n="+C+" and before is OK!"
mes " fps "+strf("% 6d",val)
D=d3timer()+1000
}
goto *Enter
}else{
mes
mes " n="+C+" is not OK!"
mes " n^2="+str(C*C)
mes " (n+1)^2="+B
goto *endn
}
*endn
mes " Halted."
repeat //追加
sleep 100
gosub *endchk
loop
*endchk //追加
if endflag:gosub *lb_HandlerRoutine:end
return
*lb_HandlerRoutine
gosub *lb_cleanup
return 0
*lb_cleanup
//終了処理
A=str(longint(C-10))
bsave "Prime_n.txt",A
return