一括表示

− 野ざらし言 −

[3655] マクロがロードされない?

としき 2010/06/05(Sat) 20:12
http://www.hinocatv.ne.jp/~toshiki/
数ヶ月に一度程度という、ごくまれにお目にかかる現象です。
数日前、会社のマシンで久しぶりに経験したので、ちょっとだけ追いかけてみたのですが、結局、原因不明。当然というか、再現もしませんでしたし。

環境は、WinXPのcommand.comでVzを常駐させていました。
VTDOSではありません。
複数行にインデントをつけようとして、行ブロック指定をしたところで^[INS]しました。
これは、cols.defを起動するキーとしてアサインしてあります。
このとき、cols.defはまだバッファに読み込まれていなかったので、外部マクロとして読み込むはずでした。
ところが、なぜかうまく動いてくれない。
[ESC]Mでマクロメニューを見ても、一見正常。
バッファにも空きはあるようですし、なにより、Eつきのマクロが2つある。
VZTOWERとVZFRECELです。
どちらかはもう忘れてしまいましたが、片方のマクロを[DEL]キーで削除して^[INS]しましたが状況は変わらず。
ところが、もう片方のマクロも[DEL]したら、マクロバッファの空きがマイナスになってしまいました。
結構重要なファイルを編集していたもので、本能的に危険を察知して、そのコマンドプロンプトはEXITしてしまいました。
しかし、その後、同じように2つのゲームマクロを読んでからファイル編集しても、全く再現しません。
正常にcols.defが読み込めてしまいます。

過去に類似の状況の記述がないか、ちょっと探してみました。
うまい検索語句が設定できないせいもあって、これだというものは見つかりませんでしたが、ひとつだけ、関係のありそうなものが引っかかってきました。
かつてのFGALDC/MES/13/2936から始まるツリーです。
ここでは、マクロバッファの表示そのものはマイナスにはなっていないようですが、真のフリー表示がマイナスになったという報告が上がっています。
ただ、なぜこの様な事になったのか、という点については、ツリーの起点の質問者を始め、質問者に真フリー表示を紹介された方を含め誰にもわからなかったようで、そのままツリーが途切れてしまっています。


ということで、質問は2つ。
マクロメニューで空きがマイナスになるというのはどのような場合でしょうか。
また、真フリー表示では負の値だが通常の空き領域表示では正の値になるというのはどのような場合でしょうか。
かつてはわからなかったことですが、もしその後の技術進歩で何かわかったことがあるようでしたら、ご案内いただけると幸いです。

[3656] Re: マクロがロードされない?

めざら 2010/06/07(Mon) 21:33
[3655]へのコメント http://homepage3.nifty.com/mezala/index.html
 再現性のない現象は,ちょっとわかりませんが。

> マクロメニューで空きがマイナスになるというのはどのような場合でしょうか。

 マクロバッファの空き領域が 32767バイトよりも多い場合,符号つきで表示されるためにマイナスになります。
 未確認ですが,マクロバッファの空きが比較的少ないときに,VZが計算違いで0よりも小さく認識してしまうことがあるかもしれません。経験的に見たような気もしますが,再現方法がわかりません。

> また、真フリー表示では負の値だが通常の空き領域表示では正の値になるというのはどのような場合でしょうか。

 上記のように,マクロバッファの空き領域が 32767バイトよりも多く確保可能であるときに,明示的に確保したマクロバッファの指定領域が 32767以下であるとき,そのようになると思います。

 いずれにしても,領域の大きさが真に負の値になることはなく,あくまでも符号つきで表示しているからですが。

 ご期待のような明快なお答えができなくて申し訳ないです。

 なお,ログを参照できない方のために,「真フリー表示」を行うための手順を示します。

 まず,モジュールメニューで確保可能なマクロバッファの領域のサイズを計算します。
* Macro
5 [ESC]M @M "Module Menu"
x$fdfb+bm-pn..-26, ; dc15#5267 m.gann
Sc[-, !97 Sc], (r>=0)?{ !98 (r>=0)? >* >^ }
(r&$FF==15)?{ r=r>>8&$7F, &Zd(r) >^ }
(r&$FF==13)?>88

 変数 x に取得された真のフリー領域を表示させるために,システムメニューを調整します。

* System menus
10 "Modules <free:$BM/$x>",40,0

 BMがユーザによって明示的に確保されたマクロバッファの領域の大きさです。
 xが確保可能なマクロバッファの領域の大きさです。

 としきさんが言うところの「真フリー表示」とは,xの値を符号つきで表示させたもので,システムメニューの仕様により符号つきで表示されます。
 符号を付けずに表示したい場合は,xに代入された値をどこかのバッファに符号なしで出力し,文字列として表示させる必要があります。

[3658] Re^2: マクロがロードされない?

としき 2010/06/11(Fri) 22:10
[3656]へのコメント http://www.hinocatv.ne.jp/~toshiki/
>  再現性のない現象は,ちょっとわかりませんが。

まぁ、当然ですよね。
とりあえず、事象の報告ということで。

>  マクロバッファの空き領域が 32767バイトよりも多い場合,符号つきで表示されるためにマイナスになります。

ロードされているマクロを削除したときに事象が発生しました。
削除するということは、当然、バッファの空き領域は増えます。
でも、正確な数字は忘れましたが、削除前は4桁(もしかしたら3桁)しか空き領域がなかったはずで、そこから4桁のマクロを削除しても32KB以上の空きができるはずはないので

>  未確認ですが,マクロバッファの空きが比較的少ないときに,VZが計算違いで0よりも小さく認識してしまうことがあるかもしれません。

こちらのほうが可能性が高そうです。


>  上記のように,マクロバッファの空き領域が 32767バイトよりも多く確保可能であるときに,明示的に確保したマクロバッファの指定領域が 32767以下であるとき,そのようになると思います。

符号つきだと負数になる、というのはよくわかったのですが、上記引用の一文がよく理解できません。
「確保可能領域」と「指定領域」って、別物なんですか?
マクロバッファって、単にBmで指定するだけと思っていたのですが、さらに別のオプションがあるのでしょうか。
申し訳ありませんが、もうちょっと解説をお願いできないでしょうか。

[3659] 指定確保領域と確保可能領域

めざら 2010/06/12(Sat) 14:59
[3658]へのコメント http://homepage3.nifty.com/mezala/index.html
> 「確保可能領域」と「指定領域」って、別物なんですか?

 別物です。同じ領域にあり,先頭が同じで,お尻が異なると言うか。

 VZのいわゆるマクロバッファという領域は,データセグメントにあります。
わたしはアセンブリ言語をきちんと学習したわけではないので,
細かいツッコミは勘弁していただくとして,簡単に言うと,
コードセグメントとデータセグメントを分離し,マクロで使うワークエリアは
マクロバッファを含め,データセグメントに配置してあります。

 データセグメントは,下位のアドレスから順に,
・コードセグメントのコピー(0000h〜068Fh)
・コマンドキーのテーブル
・ファンクションキーラベルやコマンドの説明の文字列
・初期設定ファイル(VZ.DEF)のマクロ一式(*M,*P,*S,*O,*E)
・インクルード指定したマクロ一式(*M,*P,*S,*O,*E)
…といったデータが読み込まれます。

 その次(順序は不明)に,フリーエリアとして使われる領域を飛ばして,
・エイリアスのリスト領域
・オプションH*でサイズを指定した文字列用履歴バッファ領域
・オプションTCで指定した数+3の228倍のテキストレコード領域
・オプションBlで指定したラインバッファ領域
・ラインバッファの堤防となる緩衝領域
…といったサイズ指定の領域が確保されます。

 そして,Bmで指定したサイズの外部マクロ用領域を確保します。
 このとき,指定したサイズのフリーエリアが確保できないと,

 「メモリが足りません」

…と表示され,VZは起動できません。
(6/13追記)実際には,BMの指定サイズを確保したのち,サイズ指定の
文字列バッファを確保しようとしたときに64KBに納まりきらないと
メモリが足りないということになるのだとは思います。

 この場合,コマンドラインで VZ -bm30000 などと指定しなおして実行すれば
起動する場合,マクロバッファの確保可能領域は30000よりも多いことになり,
起動しない場合はそれより少ないことになります。

                │←指定確保領域→│←余り(無駄)→│
┌───────┬────────┬───────┬────┐
│基本的環境や  │BMで指定して    │外部マクロの  │文字列用│
│コマンドなどに│明示的に    ┌─┘バッファとして│バッファ│
│使われる領域  │確保した領域│    確保した余り  │等の領域│
└───────┴──────┴─────────┴────┘
                │← 確保可能領域 −−−−−−−→│

 起動後の実際のメモリ配置は,こういうことになりますね。
┌───────┬──────┬────┬─────────┐
│基本的環境や  │BMで指定して│文字列用│  余った領域      │
│コマンドなどに│明示的に    │バッファ│    (無駄)      │
│使われる領域  │確保した領域│等の領域│                  │
└───────┴──────┴────┴─────────┘

[3660] Re: 指定確保領域と確保可能領域

としき 2010/06/13(Sun) 22:53
[3659]へのコメント http://www.hinocatv.ne.jp/~toshiki/
今夜はJAXAのサイトにろくにつながらない。
私と同じ目的で、非常に多くの人がアクセスしているのでしょう。
ほとんどDDoSと同じですね。
それはさておき。

非常にわかりやすい解説をどうもありがとうございました。
こういう図での解説は、めざらさんは上手でうらやましいです。
なるほど、元々私はH*系のバッファは多めにとっている人間ですが、それらを減らして、さらに極端に走って、TC5 Bl128なんてすればマクロバッファ *だけは* 大量に確保できるわけですね。実用的とは思えませんが。
えと、ひとつ確認。
セグメント、ということは、この図の端から端までで64KB、という理解でよいのでしょうか。

[3661] Re^2: 指定確保領域と確保可能領域

めざら 2010/06/14(Mon) 09:45
[3660]へのコメント http://homepage3.nifty.com/mezala/index.html
> 今夜はJAXAのサイトにろくにつながらない。

 数年待ち焦がれた帰還というわけですね。
 トラブル続きでも放置せずにフォローを続け,ちゃんと帰って来たというところが凄いと思いますね。無人探査船がちゃんと帰れるなら,有人飛行なんてする必要なんてないんじゃないかと思ったりもします。長期間にわたると,飛行士の健康状態が大きな問題になりますからね。

 環境に影響を与えずにインターフェイスの部分で工夫すれば,それなりにバッファを増やすことが可能ですね。
・*Command Keys のエリアのコメントアウトに見える「:」以下の文字数を判別可能な程度に削減。(Help.defの0番メニューで表示されるもの)
・*Macro のエリアの二重引用符に囲まれたマクロ名をヌルとかに削減。(マクロメニューの「:」以降に表示されるもの)
・*System Menu の 8番と13番のアイテムの整理と文字列削減(ファイラの実行メニューやファイルメニューで表示される文字列)

 でも,インターフェイス部分をケチって使い勝手が悪くなるくらいなら,マクロバッファの空きを多少我慢した方がよいと思います。としきさんが仰るように,実用的な方向でバランスを取るのが一番ですね。

> セグメント、ということは、この図の端から端までで64KB、という理解でよいのでしょうか。

 そうです。v1.58a(評価版です)未満の版は,この64KBの中にコードとデータが詰め込まれていたそうです。

 64KBがどう使われているかの概要を表示するマクロがあります。あくまでも概要ですし,名称も CSEGMAP なんてアレ(csegだけじゃないです)ですが,マクロバッファをあとどのくらい取れるかの判断には使えると思います。
・CSEGMAP.DEF - バッファ配分イメージマップ出力
http://homepage3.nifty.com/mezala/vz/workshop/mtool.html#csegmap

 もっと細かいバッファの内容は,「スタックセグメントマップ」を参照してください。まだ未完成ですが。
・スタックセグメントマップ
http://homepage3.nifty.com/mezala/vz/notes/segmap.html

[3662] Re^3: 指定確保領域と確保可能領域

としき 2010/06/15(Tue) 23:22
[3661]へのコメント http://www.hinocatv.ne.jp/~toshiki/
いやぁ、たかが無人探査機の帰還に、世の中がこんなに盛り上がるとは思いませんでした。個人的にはものすごく興奮していたのですが、私は世の中の大勢とはずれているという変な自信があったもので。

> ・*Macro のエリアの二重引用符に囲まれたマクロ名をヌルとかに削減。(マクロメニューの「:」以降に表示されるもの)

これも効果があるのですね。
その他のものは聞いた覚えがあるというか、今まで忘れていたのを思い出しましたが、これは全く記憶にありませんでした。

>  もっと細かいバッファの内容は,「スタックセグメントマップ」を参照してください。まだ未完成ですが。

これすごい。
大変な力作ではないですか。
まだ未完成という言うことですが、満足のいくまで完成させてください。

↑ このページの先頭