記事閲覧

− 野ざらし言 −

4506 Yメニュー

文太 2018/08/29(Wed) 13:41 [4493]へのコメント
=== Ytest by B ===;
PSの文字列からYmenuを作るサンプル。

* M
50 ^^ "Ytest"

	; --- make Ymenu --- 
		;-- thanx to wanama, PK14 96/07/17
		;-- thanx to taneichi, PK14 96/01/29
		;-- of course, the biggest thanx to Yushi

	&01				;-- measurements
	#] n=pn..-27,			;linebuffer
	&02 &Sm(n,r,20)			;send dummy macro (+menu header)
	n.16=l+2,			;longest string = menu width (f), 
	n.17=h,				;item num (4)
;	n.19=-1,			;cursor posit (-1, none)    (A)
	k=2+h*2, n..7=8+k+j,		;n..7 menu size (c0),       (B)
	n+=20, (k){ n.0-, n++, }	;nulls for rest of header   (C)
	&Sc(n,"PS") n=r+1,		;title (*)
	&Sm(n,ps,j)			;items after title (*)
	rr[=pn..-27, &* rr],		;exec!                      (Z)

01:	j=ps, h-, l-,			;measure longest item,item num,all len(*)
  :a	&Sn(j) (l<r)? l=r,		;longest string in PS, length=<l>
	(r)? { j+=r++, h++, >a }	;num of items num <h>
	j-=ps,				;all the length of PS (*) <j>

02:	(3+$)."$(1,a,0,ff,ff,0)!01(r)$(0,e1,c0,0,f,4,0,ff)"
;					    ^^^^ ^ ^overwrite by this macro

*
n: dummy macro + menu header (前半まで) ptr
local:
 j: <- src address // -> length of all the item strings(アイテム全長)
 h: number of items (メニューアイテム個数)
 l: longest string (メニュー幅) 足りないので、枠ぶん増やす。+2

以下、S.KIN氏, 93/5/22, <nifty:FGALPK/MES/13/816> より

 メニュー番号 |E0h
 │ サイズ
 │ │         (items + 1)*2 bytes              アイテム文字列(items 個)
 ↓ ↓        │← アイテム種類 →│            ↓
┌┬─┬┬┬┬┬─┬─┬・・┬─┬─┬─────┬────┬─・・─┬─────┐
└┴─┴┴┴┴┴─┴─┴・・┴─┴─┴─────┴────┴─・・─┴─────┘
       ↑↑↑↑                     ↑
       │││選択アイテム位置       タイトル文字列
       ││パラメータのカラム数(中身の詳細についてはS.KINさんの後のねこさんへ)
       │アイテム数(items)
       横幅

 覚書をほんと簡単にしたためます。

(A) ローカル02のメニューヘッダを書き換えるところです。-1は19バイト目です。
ffのままでいいでしょう。(C)のヌル潰しから外れていますから。

(B) Kは何なのでしょうか。+8の8は何なのでしょうか。8は簡単。メニューヘッダ前半。
ffまでです。
 h*2は間違いない。アイテム個数ぶんX2のアイテムタイプというものが入るそうです。
 では、+2は? 「mn_ext メニュー作成ルーチンのアドレス(vz が初期化)」(和生
さんノートより)が入る。2バイトなので、上のS.Kinさんのように、「(items + 1)*2」
と書いても同じになりますが、いちおう正確をきしたつもり。
 これで、すでにダミーで与えられているメニュー前半以降のメニューヘッダの長さが
でました。Kのことです。kは*itemのとおり、可変です。
 で、アイテムの全文字列長が(j)で、ヘッダ前半が8ですから、メニューサイズの
n..7が埋まりました。

(C) nを20バイト進めるのは、ダミーマクロ+ダミーメニューヘッダ(前半)、つまり
ローカル02が、20バイトだから。
 で、後半以降、メニュータイトルまで(これがk)をヌルで潰す。

(Z) 高橋さん曰く(そのとおりですね、と賛同・理解できる自分が嬉しい)、これが
Yメニューのキモ。

 ご利用の際には、(*)の4箇所だけ書き換えれば、そのままごっくんで行けます。


 何人もの方々がこんなことをしてきたはず。buftourにも感謝。


 +-+--+-+-+-+-+--+--+--+--+----------+------+------+------+
 |0|12|3|4|5|6|78|90|12|34|title str.|item1 |item2 |item3 |
 +-+--+-+-+-+-+--+--+--+--+----------+------+------+------+
              ^   |-item*2-|

=== test by B ===;
* M
50 ^^ "test"
	!01
	.
* P
1       "test",4,3,,-1
        "aaa"
        "bbb"
        "ccc"
*

                         |->menu header
4448h: 00 21 30 31 2E 00 E1 1D-00 04 03 00 FF E8 BF 00  ・!01.・・・・・・・・・ソ・ 
        4  5  6  7  8  9  0  1  2  3  4  5  6  7  8  9
           !  0  1  .    mn  size wd  c vl sl ex ex ・
                                            ^

4458h: 00 00 00 00 00 74 65 73-74 00 61 61 61 00 62 62  ・・・・・test・aaa・bb 
        0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
       ・ ・ ・ ・ ・  t  e  s  t ・  a  a  a ・  b  b

関連記事一覧ツリー (▼ を押すとツリー全体を一括表示します)

- 4456.第二の置換 - めざら 18/08/10-00:36

返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

おなまえ :
Eメール :
タイトル :
メッセージ: 通常モード(推奨)  整形モード(非推奨)  preモード(空白再現)
※ プログラムコード等を含まない場合は,できるだけ通常モードをご利用ください。

参照先 :
暗証キー: (英数字で8文字以内) プレビューなし


- 以下のフォームから自分の投稿記事を修正・削除することができます -

処理 記事No. 暗証キー