[HOME]  [全部表示 会議室風]  [全部表示 保存用]  [HOME]  [リストへもどる] [リストへもどる]

一括表示


  *SystemMenu で メニュー項目数の省略 - おうら 07/09/03-16:15 No.2708
 ┗ Re: *SystemMenu で メニュー項目数の省略 - としき 07/09/03-20:52 No.2711
  ┗ 意味は判らないけど、動くようになったようです - おうら 07/09/05-22:08 No.2717
   ┗ Re: 意味は判らないけど、動くようになったようです - konno 07/09/08-00:47 No.2718

(2708) 2708*SystemMenu で メニュー項目数の省略  投稿者:おうら   2007/09/03(月) 16:15
   コメント数 1

こんにちは、おうらです。

さて、高橋さん版からは *PopupMenu において、メニューヘッダで項目数を省略しても自動的にカウントしてくれるようになっています。これは大変便利な機能だと思いました。

そこで ファイラーのメニューなどに使う *SystemMenu でも 同様に省略出来ないかとしてみたところ dosemu ごと落ちてしまいました。どういうことか追いかけてみることにしました。vzibm.map でアドレスを調べて exdeb でしつこくトレースを繰り返し。
どうやら init.asm にある mov_menumsg というプロッシージャにおきまして、rep movsb をする直前の CX の数辺りまでが怪しい様子。
*P の時は問題無いようなのですが、*S の時だと CX がFFxx といった値(負の値?)になってしまっています。これでメモリ領域をメニューだけでなく思いっきり書き直してしまっていたようです。

そこでこの mov_menumsg を読もうとしました。が、しかし計算式が理解できません。特にも何故 add si,0ffh*2 があるのか。そして この 0ffh*2 という数字の根拠が判らなくて止まってしまいました。多分にバッファの位置の差分かと思ったりはしたのですが、どういう値なら *S でも動くのか検討がつきません。

もっともメモリを大きく書き換えるという状況も問題だと言うことで、tstb sysmeu で nz ならエラーに飛ばすようにするのも手かも知れません。しかし、どうせならファイラーメニューの書き換えで、いちいち項目の数を数える作業から開放されたいと思います。
この辺りについてヒントにでもなるお話が聞けたらと思いました、と書き込んでみました。何かご存知の方、宜しくお願いいたします。
      - No.2708 -    このTreeへ           [リストへもどる] soft

(2708) 2711Re: *SystemMenu で メニュー項目数の省略  投稿者:としき   2007/09/03(月) 20:52
参照先:http://toshiki.la.coocan.jp/
    2708 番 おうら さんへのコメント    コメント数 1

> この辺りについてヒントにでもなるお話が聞けたらと思いました、と書き込んでみました。何かご存知の方、宜しくお願いいたします。

とってもあやふやな情報で申し訳ないのですが。
大昔、ニフティのTTYの会議室で、もしかしたら関連するかもしれない情報を
読んだ記憶があります。
それは、上位バイトが0xFFだとなにか特殊な処理を行う、というような話でした。
ただ、それがシステムメニューの関係かどうかという事を覚えていないんです。

えぇと、知っていそうな人というと、やっぱりめざらさんあたりかなぁ。
適切なキーワードがわかれば、私も過去ログを検索できるんですけど。

      - No.2711 -    このTreeへ    コメント元:2708 へ [リストへもどる] pre

(2708) 2717意味は判らないけど、動くようになったようです  投稿者:おうら   2007/09/05(水) 22:08
    2711 番 としき さんへのコメント    コメント数 1

こんばんわ、おうらです。

さて、ここのところ *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
      - No.2717 -    このTreeへ    コメント元:2711 へ [リストへもどる] pre

(2708) 2718Re: 意味は判らないけど、動くようになったようです  投稿者:konno   2007/09/08(土) 00:47
    2717 番 おうら さんへのコメント

おうらさん、レス遅れてすみません。

> そのうちに、どうやら si と di の大小関係が逆?になるような時が、常にでは無く、
> *System のメニューを省略した時に時々あることに気付きました。
> そこで 試しに cxとsiの大小関係を見てから、siとdiを入れ換える処理を足してみました。
> すると落ちないだけではなく、ちゃんとメニュー項目も表示されるようになりました。

おおぉ、おうらさん、ますます凄いですねぇ。とにもかくにも動けば正義ですね。(^_^)
これもこれから試してみます。

> 一方でこんな修正はしてみたものの、頭が追い付かないのが悔しいです。はい。

いやあ、私の方こそ、全然読めてないうえに、次から次へと繰り出されるので
まったくおいてけぼりです。

ところで、せっかくソースを解析していただいているのに、最新のソースを上げて
ませんでしたね。おうらさん版Vzと一緒にアップしましたので、こちらもよろしく
おねがいします。


      - No.2718 -    このTreeへ    コメント元:2717 へ [リストへもどる] pre