たしかどっかに note 変数データあった様な?
と思って漁ってみたらやっぱりありました
これですね
HSPCTX:
PVal *note_pval; // MemNote pval
APTR note_aptr; // MemNote aptr
PVal *notep_pval; // MemNote pval (previous)
APTR notep_aptr; // MemNote aptr (previous)
notesel, noteunsel 命令でこれらの値がどう変化するかを見て
安直にこれを横取りしたりすげ替えたりしてやれば良さそうと思い
実際にやって見たら意外と簡単にできてしまいました。
以下は複数ネスト対応モジュールです。
notesel 時にポインタデータを自前スタックに移して、
noteunsel 時にそこから元に戻しています。
#今回は notesel で書き込まれた PVal, APTR を使用していますが
#ユーザー定義命令のパラメータから変数のそれを取得して書き込んでも出来ました
#その際の参考になるページ:
http://wiki.hsp.moe/小ワザ/ポインタを使ってのあれこれ.html
// メモリーノートパッド命令の複数ネストに対応するモジュール
#module mod_notex
#undef notesel
#undef noteunsel
#const NOTE_INITSIZE 10 ; 初期配列サイズ
#deffunc notesel var v
mref hspctx, 68
if hspctx(202) = 0 :dim stack_note, 2, NOTE_INITSIZE
notesel@hsp v
stack_note(0, i) = hspctx(204), hspctx(205)
i ++
return
#deffunc noteunsel
if i > 1 {
i --
hspctx(204) = stack_note(0, i)
hspctx(205) = stack_note(1, i)
}
noteunsel@hsp
return
#global
使い方は通常の note 命令と同じで既存の命令がそのまま使えます。
一応 HSP の、notesel をした後に noteunsel を何回実行しても
最後の一つは解除されないという仕様に沿っています。
それほどテストしてませんが一応は
>http://hsp.tv/play/pforum.php?mode=all&num=72046#72052
このレスのスクリプトで動きました。
まだまだ改善の余地がありそうですが、
適当に改造してみても面白いかもしれません。
何か問題が有ったら教えて下さい