負数は1バイト?(Yushiメニュー) 前に金野さんに vz(ibmj).com の改造でおねだりしたことがあったのですが、 そんなのマクロで解決すればよかったのだ、と今頃思い出したのです。おねだり したのはステータスラインの表示法のカスタマイズで、早い話、他の情報を削っ てファイル名をもっと長く見せられるようにして、というものでした。 で、あ、そんなのマクロだ、ばかりでなく、表示の仕方もすげえハイテク部品 な方法が一番いいことに思い至ってしまったのです。つまり Yushi メニュー法。 現実的には、2窓でほとんど同一名でありながら深く掘られたディレクトリに存 在するファイルの比較をしている場面を想定しています(僕の個人的な現実)。 c:\hoge1\longlong\madamada\ikuyo\nagai\direct\ry\genko01.txt c:\hoge2\longlong\madamada\ikuyo\nagai\direct\ry\genko01.txt ^ここだけ違う。普通のステータスでは見られない。 パーツ発見がすぐだったので(多謝です>住所録様、めざら様)、(なんか無 駄っぽいコーディングだなぁと思いつつ)、サクサク。で、デケタ! まではよ かったのですが、はやり原理を理解していない辛さ、泣きついてしまうことにし ました。(メニューのマクロバッファ格納法も調べたには調べたのだけど…。) 上下2窓状態で以下を実行してみてください。ここまでは完動品なので。実害 もありません。 ですが、メニュー内のカーソルを消したいのです。選択するマクロではないの ですから。でも、消えてくれない。コメントアウトしてあるところでもがいたの ですが、ご教示いただければ幸いです。(記事タイトルが意味不明かもしれない ですが、そんなことを考えたのです。) (追伸:桁折りなしで書き込もうと思ったのですが、プレビュー画面が機能しま せんでした。) === TwoFname.def === #if0 横分割、上下画面でのみ起動可。メニューでフルパスネームを表示。これだけ。 original: PK (13) #02685 96/01/27/ Yushi #endif * M 50 ^^ "TwoFname" ?. (wt>1 && wt<4)?? {&m("Two up/down windows only!").} (wt==2)? {&00 #62 &01 #62} ;upper window = PA (wt==3)? {&01 #62 &00 #62} ;lower window = PR &09 p.0=66, ; メニューの横幅 p.1=i=2, ; アイテム数 ; p.2=-1, ; カーソルなし p+=2, ; ここもいじったけど…。 (i*2+4){ p.0-, p++, } &Sc(p," FULL PATH FILENAMES ") p=r+1, &Sc(p,pa) p=r+1, &Sc(p,pr) p=r+1, !01 00:; -- upper -> pa &Sp(pa,"%s -%u",wa+146,ln) 01:; -- lower -> pr &Sp(pr,"%s -%u",wa+146,ln) 9: p$-4, p+=5+p..0, 97: "$[150]" *
> ですが、メニュー内のカーソルを消したいのです。選択するマクロではないの> ですから。でも、消えてくれない。> &09 ;pの初期アドレス> p.0=66, ;0123456789> p.1=i=2, ; 2> ; p.2=-1, ; *> p+=2, ; pの更新アドレス> (i*2+4){ p.0-, p++, } ; 00000000桁位置を見れば自明のことですが,この*位置に代入した-1は, その直後にヌルで塗り潰されているのです。 一番簡単なのは 静的なアドレス q を初期の p と同じアドレスにしておき, ヌル潰し後に書き込めばよいことになります。 &09 q=p, p.0=66, ; メニューの横幅 p.1=i=2, ; アイテム数 ; p.3=1, ; カーソルなし p+=2, ; ここもいじったけど…。 (i*2+4){ p.0-, p++, } q.3=-1,
めざらさん 多謝!!! うれしっ!!! サンクスです。> p+=2, ; pの更新アドレス> (i*2+4){ p.0-, p++, } ; 00000000そっか、p+=3, とかしても、8個のヌルが8個のまま後ろにずれてたんですね (ま、そのような試行錯誤がありました)。 まだ、もう少し読み込まないと汎用部品としては使い切れませんけれど、おお、 ついに文太も Yushi メニュー(こういう使い方なら誰でもできる)。 と理屈が分かっても(一部ですが)、qはなかなか出てこなかったでしょう。 多謝でありまする。
めざらさん 忘恩の輩みたいかもしれませんが、これが引けなかったのがどうしてだろう? と思っていたのです。 こんなわけで、blogでログから住所録へ飛ぶルーチンが やはりいまだ必要かも知れない、と思ってしまう。作るかは未定ですが。(バグ まだあるんだよなぁ…。知らん)。 ん? 別マクロを作ればいいんだ。 以下は、そのうちちゃんとやろうと(何を?)今作ったものです。 小物マクロの住所録 1995.05 nifty:FGALPK/MES/14/ 11685 Yushi 【講座】メニューの構造(1) Yushiメニュー解説 11696 Yushi 【講座】メニューの構造(2) 11710 Yushi 【講座】メニューの構造(3) 11761 Yushi 【講座】データセグメントの話
基本のきなのでしょう。少なくともそう思っているから気になる。でも分から ない。パソコンでの数の数え方です。負数です。 1バイトの入れ物にマイナス1を入れると、255 となる。1バイトは8ビット だから、0000 0000 の8つがゼロと1を取ることができるのだから、2の8乗で256。よく言う 奴。で、255? まわるんでしょうか? どういう風に? 誰がどう判定する のでしょうか? ご教示いただければ幸いです。 === Macro Tmp by Bunta ===; * Macro 50 ^^ "mactest" &00 a.0=-1, &01 b.0=255, &m("a.0:%d a.0:%c a.0:%s",a.0,a.0,a.0) &m("b.0:%d b.0:%c b.0:%s",b.0,b.0,b.0) 00: a=4+$,."0" 01: b=4+$,."0" *
> 1バイトの入れ物にマイナス1を入れると、255 となる。1バイトは8ビット
> だから、0000 0000
> の8つがゼロと1を取ることができるのだから、2の8乗で256。よく言う
> 奴。で、255? まわるんでしょうか? どういう風に? 誰がどう判定する
> のでしょうか?
としきさん、めざらさん ありがとうございました。分かった、とは言えないものの、だいたいイメージ は掴めたように感じています。「取り出し方によりけり」「最上位ビットが立つ と負数」というあたりがネックですね。多謝です。m(__)m まあ、こんなとこまででいいかな、ととりあえずしておきます。m(__)m
めざらさん うまい質問の仕方が分からないのですが、先日のYメニュー使用のフルパス表 示マクロを、5種類の画面に対応させ(分割あり=4、分割無し=1)、ライン バッファを使ってマクロバッファの圧迫を抑えようとさせました。駄目です。 1週間やって?(+_+)(T_T)。 =============より上の情報取得までは問題ないはずなのですが、どっかの計算 が狂っているようです。まともに表示してくれません。申し訳ありませんが、動か してみて、読んでいただけませんでしょうか。m(_B_)m 下の方に、参考資料を念のためつけました。 === Test.def ===;和生氏,96/7/17, <nifty:FGALPK/MES/14/18037>を参考にしている。 *m 50 ^^ "test" ?. ;wt 02345 (wt)? { i=2, ;横u,l,縦u,l (wt%2) ? {#62 &00 #62 &01} ;3,5 ? {&00 #62 &01 #62} ;2,4 (0)} ? {i=1, &00} #] ;lbuf -> textbuf ;以下ほぼ同じ(▲が微妙な相違箇所)============ m=n=pn..-26, ;lbuf, ダミーマクロを作る▲ &02 &Sm(m,r,20) ;m からメニュー幅まで m.16=66, ;メニュー幅(f)▲ m.17=i, ;アイテム数 (1 or 2)▲ k=(i+1)*2, m..7=(k+4)+b, ;m..7 メニューサイズ(c0)▲ +8? (a) m+=20,(k){m.0-,m++,} ;アイテム種用空白 ; n.19=-1, &Sc(m," FULL PATH FILENAMES ") ;タイトル m=r+1, &Sc(m,pa) ;タイトルの後にアイテム (i>2)? {m=r+1, &Sc(m,pr)} ;▲ (a)でインクリメントしているから。 rr[=pn..-26, &* rr], ;実行 00:; -- upper -> pa &Sp(pa,"%s -%u",wa+146,ln) &Sl(pa) &Sn(pa) b=r+1, ;<b>size(文字列長+null1つ) 01:; -- lower -> pr &Sp(pr,"%s -%u",wa+146,ln) &Sl(pr) &Sn(pr) b+=r+1, 02:; -- ymenu header (3+$)."$(1,a,0,ff,ff,0)!01(r)$(0,e1,84,0,f,2)";0,0 ; ^^^^ ^ ^★ ここはマクロ中で書換 * ; * si,ze,width,items,0,-1 *ここまで10bytes ----- 和生氏,96/7/17, <nifty:FGALPK/MES/14/18037> ----- =T *m 80^\""?. &01 m=pn..-27, ;ダミーマクロを作る &02 &Sm(m,r,20) ;m からメニュー幅まで m.16=l, ;長い ps をメニュー幅(f) m.17=i, ;ps の数をアイテム数 (4) k=i++*2, m..7=j+k+8, ;m..7 メニューサイズ(c0) m+=20,(k){m.0-,m++,} ;アイテム種用空白 &Sc(m,"PS") m=r+1, ;タイトル &Sm(m,ps,j) ;タイトルの後にアイテム rr[=pn..-27, &* rr], ;実行 1: j=ps,i-,l-, ;ps を測る :a &Sn(j)(l<r)?l=r, ;一番長い ps の文字列 (r)?{j+=r++,i++,>a} ;文字列がいくつあるか j=j-ps, ;全体の長さ 2: (3+$)."$(1,a,0,ff,ff,0)!01(r)$(0,e1,c0,0,f,4)";0,0 ; ^^^^ ^ ^★ ここはマクロ中で書換 * 【from mes14_#11710 by Yushi】 》 ローカルマクロ 02: で、定義した文字列を分解して説明すると 》 $(1) グローバルマクロ1番を表す。 》 $(a,0) グローバルマクロのサイズを表す。 》 a,0 で 10 bytes を表す。次のキー定義から、グローバルマクロ終 》 了の $(0) まで、数えたら 10 bytes 》 $(ff,ff) グローバルマクロの起動キー2つ分 》 $ff は未設定という意味 》 $(0) マクロタイトル 》 文字列+ $(0) なのですが、タイトルを省略した形 》 !01 メニューの1番を呼びだす 》 サイズ情報に基づいて次の項目から順にサーチしていく 》 次を メニュー1番のように細工すれば、ちゃんと騙されてくれる 》 (r) 返り値を内部レジスタに入れる。 》 親マクロに返った時、内部レジスタの値が、r に代入されるから 》 こうしておかないと、親マクロに返った時 r が破壊されてしまう 》 $(0) グローバルマクロの終了を表す . と同じ意味 》 このおかげで、親マクロに帰っていく 》 $(e1) メニュー1番を表す数値 》 $(c0,0) メニューのサイズ 192 bytes を表す。 ★ 》 用意したバッファの全体が 256 bytes なので、適当に設定 》 $(f) メニューの横幅 16 ★ 》 $(4) アイテム数 ★ 》 ; 0,0 このマクロを読み込むと、文字列の終端 " が $(0) になり、 》 その後に、マクロの終了を表す $(0) が付くので、わざわざ定義 》 しない。2 bytes お得。合わせて 20 bytes 》 この文字列の理解が重要。 》 》 &z 関数を使うと、読み込んだマクロの先頭が rr に代入される。&* は、ポインタ 》 rr からマクロを実行して、帰ってくる。それなら、rr にマクロバッファとは、ま 》 るで違うが、 マクロにしか見えない場所を代入して、&* で呼び出したらどうなる 》 か。ちゃんと実行してくれました。(^_^) 格納されたメニューヘッダ [E1][1F]・[0F][02]・・・・・・==MENU==・menu1・menu2・・・・・・ | +-+ | | 2parameters+(items+1)*2 | | | + アイテム数 | | +横幅 | +バイト数 +メニュー番号 ($E0+n)
めざらさん 丁寧にありがとうございました。…てゆうか(笑)。それでも、現実にドンピ シャでした。参ったな。3日間ぐらいどうして乱れ続けたのだろう…???> うちの環境では,wbにあたるファイル名がラインバッファに複写されていない> ように思えますけれど,それは正しい動作なんですか? (そうは思えないけど)ここだけで、直ってしまいました。インクリメントから足し算に直していたの を忘れてた。(T_T) たしかに裏テキストの情報が転送されてませんでした。m(__)m> …てゆうか,所期の動作はどういうものなのですか?> 確かこの前のものはwaとwbにあたるファイルのフルパスを表示するものだった> ですよね。今度のは何を狙ったコードになっているのですか?基本的には同じです。ただ分割画面もそうでないのにも対応するために、つま りアイテム数とサイズを動的に管理できるようにしたのです。これでほんとのY メニュー。ラインバッファ使用(^^)v ついにやった、ふう。ほんのちょっとの一言で天と地の差。ありがとうござい ました。m(__)m === Twofname.def ===;a lot from 和生氏, 96/7/17, <nifty:FGALPK/MES/14/18037> #if0 フルパスファイル名と行番号をYメニューで表示(機能としてはそれだけ)。 分割画面では、上と左窓の情報は常に上の行に表示。 #endif *Macro 50 ^^ "Twofname" ?. w-, (wt%2)? {#W w+,} ;wt 02 3 4 5 (wt)? {i=2, &00 &01 (0)} ; u l L R ? {i=1, &00} (w)? #W ;泥くさ… #] ;lbuf -> textbuf m=n=pn..-26, ;lbuf, ダミーマクロを作る &02 &Sm(m,r,20) ;m からメニュー幅まで m.16=66, ;メニュー幅(f) m.17=i, ;アイテム数 (1 or 2) k=(i+1)*2, ;アイテム種用空白 m..7=(k+4)+b, ;m..7 メニューサイズ(c0)▲ +8? m+=20, (k){m.0-,m++,} ;アイテム種用空白 n.19=-1, ;カーソルなし &Sc(m," FULL PATH FILENAMES ") ;タイトル m=r+1, &Sc(m,pa) ;タイトルの後にアイテム (i>1)? {m=r+1, &Sc(m,pr)} ;▲ rr[=pn..-26, &* rr], ;実行 00:; -- upper/left -> pa &Sp(pa,"%s -%u",wa+146,wa.10) ;wa.10 == ln &Sl(pa) &Sn(pa) b=r+1, ;<b>size(文字列長+null1つ) 01:; -- lower/right -> pr &Sp(pr,"%s -%u",wb+146,wb.10) &Sl(pr) &Sn(pr) b+=r+1, 02:; -- ymenu header (3+$)."$(1,a,0,ff,ff,0)!01(r)$(0,e1,84,0,f,2)";0,0 ; ^^^^ ^ ^★ ここはマクロ中で書換 * ; * si,ze,width,items,0,-1 *ここまで10bytes
めざらさん> なにやら,一を聞いて十を知る分別のよさ,って雰囲気ではありませんか。>「ありゃー,ぶんちゃん近ごろ妙に実力つけてんとちゃうかぁ〜」みたいな。おほ。めざらさんに誉められちゃった。(*^。^*) 久しぶりな感じで感涙。> コードはもう少し整理できそうな気がしますね。どこですかぁ? 前半ですよねぇm(__)m> これは最大2ファイルなので,それぞれバッファを使っても問題は生じませ>んが,すぐに沢山のアイテムをコピーする欲求に駆られることになるわけです>から,単一の作業バッファを使いまわすようにした方が後々楽ですよ。はい、これは分かります。和生版では ps を対象にしてますよね。で、そこは 読めたつもりです。ただ僕はこのYメニューの作り方が分かりやすいし(とらじ さんが関数型を目指したのをちらと見ただけですが)、実際これしか分からない のですが、ラインバッファに送る前にメニューアイテムを格納しておく作業バッ ファとしては、既存ヒストリーですよね、真っ先に。もちろんサイズによりけり ですが、僕は自前バッファを使いたくないな、と思ってます。今頃ですが、マク ロバッファ圧迫が気になりはじめて…。blog なんて最低、そういう意味では。 あ、既存ヒストリーでも一つでよいでしょう、というご指摘の意味は理解してい ます。> ローカルを共通化しておいて,呼ぶ前に変数にアドレスだけセットするよう>にすれば,まるで高級言語のサブルーチンみたいな汎用性が出てくるでしょう。> そう,「あとで使いまわせる」。うふふふ,なんて魅力的な誘惑。(^^)魅惑的ですよね。やるかなぁ…。必要が生じないとなぁ…。怠惰パパ。