負数は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 なんて最低、そういう意味では。 あ、既存ヒストリーでも一つでよいでしょう、というご指摘の意味は理解してい ます。> ローカルを共通化しておいて,呼ぶ前に変数にアドレスだけセットするよう>にすれば,まるで高級言語のサブルーチンみたいな汎用性が出てくるでしょう。> そう,「あとで使いまわせる」。うふふふ,なんて魅力的な誘惑。(^^)魅惑的ですよね。やるかなぁ…。必要が生じないとなぁ…。怠惰パパ。