こんばんわ、おうらです。
さて、ここのところ *System メニュー登録で項目数の省略が
出来ないものかと試行錯誤しておりました。
そのうちに、どうやら si と di の大小関係が逆?になるような時が、常にでは無く、
*System のメニューを省略した時に時々あることに気付きました。
そこで 試しに cxとsiの大小関係を見てから、siとdiを入れ換える処理を足してみました。
すると落ちないだけではなく、ちゃんとメニュー項目も表示されるようになりました。
ワタクシのところでいろいろと試したうちでは動きました。びっくり。
これでうまくいくようなら、#ifブロック を使って環境によって可変な
ファイラーメニューの定義も作れちゃうのでラッキーです。
一方でこんな修正はしてみたものの、頭が追い付かないのが悔しいです。はい。
;--- mov menu message ---
;--> bx,ch
;<-- es:di
public mov_menumsg
mov_menumsg proc
pushm <ds,ax,bx,cx,si>
movseg ds,es
mov al,ch
clr ah ; ax = mn_c
mov cx,di
add bx,type _menu
mov si,bx
add si,0FFh*2 ; si = bx+sizeof(_menu) + 0ffh*2
mov di,bx
shl ax,1
add di,ax ; di = bx+sizeof(_menu) + ch*2
cmp cx,si ; # 追加
_if c ; # 追加
xchg di,si ; # 追加
_endif ; # 追加
sub cx,si ; cx = di - si
rep movsb
popm <si,cx,bx,ax,ds>
ret
mov_menumsg endp
おうらさん、レス遅れてすみません。
> そのうちに、どうやら si と di の大小関係が逆?になるような時が、常にでは無く、
> *System のメニューを省略した時に時々あることに気付きました。
> そこで 試しに cxとsiの大小関係を見てから、siとdiを入れ換える処理を足してみました。
> すると落ちないだけではなく、ちゃんとメニュー項目も表示されるようになりました。
おおぉ、おうらさん、ますます凄いですねぇ。とにもかくにも動けば正義ですね。(^_^)
これもこれから試してみます。
> 一方でこんな修正はしてみたものの、頭が追い付かないのが悔しいです。はい。
いやあ、私の方こそ、全然読めてないうえに、次から次へと繰り出されるので
まったくおいてけぼりです。
ところで、せっかくソースを解析していただいているのに、最新のソースを上げて
ませんでしたね。おうらさん版Vzと一緒にアップしましたので、こちらもよろしく
おねがいします。