一括表示

− 野ざらし言 −

[1468] 負数は1バイト?(Yushiメニュー)

文太 2006/11/26(Sun) 21:07
負数は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]"
*

[1469] Re: 負数は1バイト?(Yushiメニュー)

めざら 2006/11/26(Sun) 22:15
[1468]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
>  ですが、メニュー内のカーソルを消したいのです。選択するマクロではないの
> ですから。でも、消えてくれない。

>         &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,

[1471] Re^2: 負数は1バイト?(Yushiメニュー)

文太 2006/11/26(Sun) 22:49
[1469]へのコメント
めざらさん

 多謝!!! うれしっ!!! サンクスです。

>         p+=2,                   ;  pの更新アドレス
>         (i*2+4){ p.0-, p++, }   ;  00000000

 そっか、p+=3, とかしても、8個のヌルが8個のまま後ろにずれてたんですね
(ま、そのような試行錯誤がありました)。
 まだ、もう少し読み込まないと汎用部品としては使い切れませんけれど、おお、
ついに文太も Yushi メニュー(こういう使い方なら誰でもできる)。

 と理屈が分かっても(一部ですが)、qはなかなか出てこなかったでしょう。
多謝でありまする。

[1476] Re^3: 負数は1バイト?(Yushiメニュー)

文太 2006/11/27(Mon) 00:44
[1471]へのコメント
めざらさん

 忘恩の輩みたいかもしれませんが、これが引けなかったのがどうしてだろう?
と思っていたのです。 こんなわけで、blogでログから住所録へ飛ぶルーチンが
やはりいまだ必要かも知れない、と思ってしまう。作るかは未定ですが。(バグ
まだあるんだよなぁ…。知らん)。

 ん? 別マクロを作ればいいんだ。

 以下は、そのうちちゃんとやろうと(何を?)今作ったものです。

小物マクロの住所録 1995.05

nifty:FGALPK/MES/14/
11685  Yushi            【講座】メニューの構造(1) Yushiメニュー解説
11696  Yushi            【講座】メニューの構造(2)
11710  Yushi            【講座】メニューの構造(3)
11761  Yushi            【講座】データセグメントの話

[1488] やっぱり負数

文太 2006/11/28(Tue) 00:29
[1476]へのコメント
 基本のきなのでしょう。少なくともそう思っているから気になる。でも分から
ない。パソコンでの数の数え方です。負数です。

 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"
*

[1490] Re: やっぱり負数

としき@宿直 2006/11/28(Tue) 01:49
[1488]へのコメント http://www.hinocatv.ne.jp/~toshiki/
22時半くらいからの約2時間はとてつもなく忙しかったですが、やっとの
ことで一段落しました。

>  1バイトの入れ物にマイナス1を入れると、255 となる。1バイトは8ビット
> だから、0000 0000
>  の8つがゼロと1を取ることができるのだから、2の8乗で256。よく言う
> 奴。で、255? まわるんでしょうか? どういう風に? 誰がどう判定する
> のでしょうか?

この辺は私も理解に苦しんだのですが。
10進数だと、1桁で0から9の10通りの値をとります。
1バイトでは0から255の256通りの値をとります。
これだと、正の数しか取れません。
なので、単純に128を減算します。
すると、−128から127の範囲をとることができます。
でも、ビット列だけを見た場合、−1も255も同じです。
これは、使う側(プログラマ)が正なのか負なのかを決めます。
例えば、言語によっては、同じ1バイトの変数でも、正と負の両方を扱うか、
正だけを扱うか、と宣言するようになっているものもあります。

まわる、というか、1111 1111に1を足せば0000 0000になって、繰り上がり
が発生します。マシン語レベルでは、キャリーフラグがセットされます。
同じく、0000 0000から1引けば1111 1111になり、なんかのフラグがセット
されたなぁ。ボローフラグといったかな、キャリーを兼用しているCPUも
あるような気がする。
10進数で127、すなわち0111 1111に1を足すと1000 0000になりますが、
これは符号付だと−128になります。多分、ここが一番わけわからんとこ
ろでしょう。

[1491] Re: やっぱり負数

めざら 2006/11/28(Tue) 08:29
[1488]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
 多くの言語では変数に「型」というものがあって、システムによる違いを吸収する仕組みになっていると思いますが、VZには変数型の概念はありません。

 どのようになっているかというと、値の読み出し方で変わります。型に相当する部分はここで解釈することで、コードを簡略化できていると考えられます。

 では、値を代入するときはどうなっているのかですが、これはおそらく入れ物に応じた型の変換が自動的に行われるのではないかと思われます。

 VZの変数は2バイトの入れ物になっていますが、中には1バイトの値しかとらない変数もあります。例えばmrのようなものです。そういう変数に無理やり255を超える値を代入しようとしても、突出した分だけが残り、他は切り捨てられます。いわゆる丸められるというものです。

 本当のところはソースを読めないとわからないですけど。

 なお、符号付きになる状態というのは、最上位ビットが立っている状態で、-1という値はすべてのビットが立った状態です。8ビットの入れ物であれば、FFhが-1として扱われます。

[1492] Re: やっぱり負数

文太 2006/11/28(Tue) 10:37
[1488]へのコメント
としきさん、めざらさん

 ありがとうございました。分かった、とは言えないものの、だいたいイメージ
は掴めたように感じています。「取り出し方によりけり」「最上位ビットが立つ
と負数」というあたりがネックですね。多謝です。m(__)m

 まあ、こんなとこまででいいかな、ととりあえずしておきます。m(__)m

[1512] Re^3: 負数は1バイト?(Yushiメニュー)

文太 2006/12/02(Sat) 23:42
[1471]へのコメント
めざらさん

 うまい質問の仕方が分からないのですが、先日の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)

[1517] Re^4: 負数は1バイト?(Yushiメニュー)

めざら 2006/12/03(Sun) 10:48
[1512]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/index.html
 …てゆうか,所期の動作はどういうものなのですか?

 確かこの前のものはwaとwbにあたるファイルのフルパスを表示するものだった
ですよね。今度のは何を狙ったコードになっているのですか?

 仕様が解らなければ,動作も正しいかどうかわかりませんが。

 うちの環境では,wbにあたるファイル名がラインバッファに複写されていない
ように思えますけれど,それは正しい動作なんですか? (そうは思えないけど)

[1523] Yushiメニュー、完成

文太 2006/12/03(Sun) 16:04
[1517]へのコメント
めざらさん

 丁寧にありがとうございました。…てゆうか(笑)。それでも、現実にドンピ
シャでした。参ったな。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

[1537] Re: Yushiメニュー、完成

めざら 2006/12/04(Mon) 17:39
[1523]へのコメント <mezala@nifty.com> http://homepage3.nifty.com/mezala/
 なにやら,一を聞いて十を知る分別のよさ,って雰囲気ではありませんか。
「ありゃー,ぶんちゃん近ごろ妙に実力つけてんとちゃうかぁ〜」みたいな。

 コードはもう少し整理できそうな気がしますね。

 これは最大2ファイルなので,それぞれバッファを使っても問題は生じませ
んが,すぐに沢山のアイテムをコピーする欲求に駆られることになるわけです
から,単一の作業バッファを使いまわすようにした方が後々楽ですよ。

 ローカルを共通化しておいて,呼ぶ前に変数にアドレスだけセットするよう
にすれば,まるで高級言語のサブルーチンみたいな汎用性が出てくるでしょう。

 そう,「あとで使いまわせる」。うふふふ,なんて魅力的な誘惑。(^^)

[1543] Re^2: Yushiメニュー、完成

文太 2006/12/04(Mon) 22:59
[1537]へのコメント
めざらさん

> なにやら,一を聞いて十を知る分別のよさ,って雰囲気ではありませんか。
>「ありゃー,ぶんちゃん近ごろ妙に実力つけてんとちゃうかぁ〜」みたいな。

 おほ。めざらさんに誉められちゃった。(*^。^*) 久しぶりな感じで感涙。

> コードはもう少し整理できそうな気がしますね。

 どこですかぁ? 前半ですよねぇm(__)m

> これは最大2ファイルなので,それぞれバッファを使っても問題は生じませ
>んが,すぐに沢山のアイテムをコピーする欲求に駆られることになるわけです
>から,単一の作業バッファを使いまわすようにした方が後々楽ですよ。

 はい、これは分かります。和生版では ps を対象にしてますよね。で、そこは
読めたつもりです。ただ僕はこのYメニューの作り方が分かりやすいし(とらじ
さんが関数型を目指したのをちらと見ただけですが)、実際これしか分からない
のですが、ラインバッファに送る前にメニューアイテムを格納しておく作業バッ
ファとしては、既存ヒストリーですよね、真っ先に。もちろんサイズによりけり
ですが、僕は自前バッファを使いたくないな、と思ってます。今頃ですが、マク
ロバッファ圧迫が気になりはじめて…。blog  なんて最低、そういう意味では。
あ、既存ヒストリーでも一つでよいでしょう、というご指摘の意味は理解してい
ます。

> ローカルを共通化しておいて,呼ぶ前に変数にアドレスだけセットするよう
>にすれば,まるで高級言語のサブルーチンみたいな汎用性が出てくるでしょう。
> そう,「あとで使いまわせる」。うふふふ,なんて魅力的な誘惑。(^^)

 魅惑的ですよね。やるかなぁ…。必要が生じないとなぁ…。怠惰パパ。

↑ このページの先頭