今日のテーマ   日々改造 (^_^;)         
[記事リスト(ツリー表示)]  [ 返信 ]   [新着記事] [最新50] [ワード検索] [過去ログ]

タイトル EMS_buff.def (0.5)
投稿日: 2018/12/30(日) 23:39
投稿者文太
 番 号 8647    8638 番 文太 さんへのコメント

 やりたいときにやってしまえ。
 記念に上げます。

 データ構造を少しだけ洗練させた(使うの、それ、ほんとに?)
 バッファを4つに増やした。EMS4ページ。
 きちんと環境管理できるなら、4つのマクロから別々にバッファを使えるはず、
なんだけど……。ヒストリーとか面倒なことなく。1個のデータね、それぞれ。
 こういう風にEMSって使えるのか、テストもまだろくすっぽしてないのにね。
 本質的には、約10年前の1kbuf.comのときと同じことをしています。
 同じところをぐるぐるぐるぐる。このパターンは不変。
 違いは、やっぱりVzマクロを素直に使うと(マシン語にばかり頼らないと)
コーディングが楽です。パパパっとできる。
 あくまでバッファを造ろうとしているだけなんだから、下はみんなブラックボックス
になるのが理想です。


=== EMS_buff.def (0.5) by Bunta ===;
#if0
 習作・部品・テスト用マクロ
 未完成(histcopy system, not yet)--- will you really do that?
  これは別マクロね、するとしても。
 以下は、テストのため、全部の機能を入れてしまってます。実用的には、
EMS情報領域確保、データ領域(EMS)確保
EMS解放
 の2つの間に、データの出し入れのマクロないしマクロ部品が存在するはずです(願望)

EMSに文字列を保存するテスト。
4ページ(16KB*4)の領域を、4つのバッファとして確保する。使いきれるとは思えないが。
Bv (logtbl) 256 前提。
pq..145+128以降の10バイト*4を恒久的管理用データ保存バッファとして使用。
 中身はアイテム個数、全体文字列長、先頭文字列長、EMSハンドル、EMSセグメント
 【データ構造】(a-d)
 a..0:アイテム個数
 a..1:データ全体長
 a..2;先頭文字列長
 a..3:EMS handle
 a..4:EMS frame seg

★カスタマイズが必要なのかもしれない箇所。
 ★1 Vzのお腹の中にあるべきデータ保存バッファ
 ★2 EMSページフレームのアドレス(セグメント)。vmapで調べておく。

二重起動しないようエラーチェックを入れた。
細かいことを書いておくと、文字列コピーとし、最後のヌルも転送することにした。
 その後の処理がこのほうが楽なような気がする。
EMS解放で、Bv管理データバッファもクリアするようにした。

 【to do】
 データの格納はヌル区切り、ヌルヌル末尾のヒストリー形式にすること。
 データ格納・管理が大変になるよ……。
#endif

* Macro
50 ^NX "EMS_buff"

	nn[, oo[, pp[, qq[,

	;--- sample string & its length with ending null
        n="aaaあdefい",			;<n>
        &Sn(n) nn=r+1,			;<nn>, +1 means "with null"
	o="bbbいいい",			;<o>
        &Sn(o) oo=r+1,			;<oo>
        p="cccうdefうx",		;<p>
        &Sn(p) pp=r+1,			;<pp>
	q="dddえええy",			;<q>
        &Sn(q) qq=r+1,			;<qq>

	;--- set Bv data buffer
	a=pq..145+128,		;Bv personal buffer★1 upto +126 (hometext.def)
	b=pq..145+138,
	c=pq..145+148,
	d=pq..145+158,

	;--- check if EMS buff exists or not
	x=$c000,		;<e> EMS frame address★2 各自、事前にチェック設定のこと
	(a..4==x)? {&m("EMS already gotten.") .}


	;-------------------------------------------------------
	;--- save EMS info
			a..0=1,		;item
			a..1=nn,	;all_length
			a..2=nn,	;top_str_length
        &Ea(1) 		a..3=r,		;EMS handle (allocation)
        &Em(a..3) 	a..4=r,		;EMS segment (mapping)

	;--- iseg strcopy (-> EMS)	<x> 4 identifiers, <y> str ptr in gz
	x=a, y=n, &00
        &m("1st string written on EMS(1); handle %d",a..3)
        &p
	;-------------------------------------------------------
			b..0=1,		;item
			b..1=oo,	;all_length
			b..2=oo,	;top_str_length
        &Ea(1) 		b..3=r,		;EMS handle
        &Em(b..3) 	b..4=r,		;EMS segment
	x=b, y=o, &00
        &m("2nd string written on EMS(2); handle %d",b..3)
        &p
	;-------------------------------------------------------
			c..0=1,		;item
			c..1=pp,	;all_length
			c..2=pp,	;top_str_length
        &Ea(1) 		c..3=r,		;EMS handle
        &Em(c..3) 	c..4=r,		;EMS segment
	x=c, y=p, &00
        &m("3rd string written on EMS(3); handle %d",c..3)
        &p
	;-------------------------------------------------------
			d..0=1,		;item
			d..1=qq,	;all_length
			d..2=qq,	;top_str_length
        &Ea(1) 		d..3=r,		;EMS handle
        &Em(d..3) 	d..4=r,		;EMS segment
	x=d, y=q, &00
        &m("4th string written on EMS(4); handle %d",d..3)
        &p
	;-------------------------------------------------------

&m("4 strings written on 4 EMS pages; handle %d,%d,%d,%d",a..3,b..3,c..3,d..3)
	qq], pp], oo], nn],
	.


	;--- strcopy prep		;<x> <y>
00:	ax=gz, si=y, cx=x..2,		;set source
	bx=x..4, di=0,			;set destination
	;--- iseg strcopy
	;str_cpy; ax,si -> bx,di, cx times

	&i("$(50,1F,53,07,F3,A4,C3)")


;----------------------------------------------------------------------------------

51 ^NY "fromEMS"

	a=pq..145+128,	;Bv personal buffer★1 upto +126 (hometext.def)
	b=pq..145+138,
	c=pq..145+148,
	d=pq..145+158,

	;--- check if EMS buff exists or not
	x=$c000,	;EMS frame address★ 各自、事前にチェック設定のこと
	(a..4==x)?? {&m("EMS buffer not exists.") .}

	(ks&1)? >A	;Close EMS page by shift


	;--- copy str from EMS buff to PR

	!01 (r<0)? {&m("canceled.").}
	(r)>? {(x=a)(x=b)(x=c)(x=d)}	;<x>

        &Em(x..3)			;EMS mapped with handle <x..3>

	;--- strcopy prep
        ax=x..4, si=0, cx=x..2,		;set source
        bx=gz, di=pr,			;set destination

	;--- iseg strcopy
	;str_cpy; ax,si -> bx,di, cx times

	&i("$(50,1F,53,07,F3,A4,C3)")

        &m("%s, read from EMS",pr)
	.

 :A 	;--- Del 4 EMS buffers ---

        &Ef(a..3)			;close EMS
        &Ef(b..3)			;close EMS
        &Ef(c..3)			;close EMS
        &Ef(d..3)			;close EMS

	&m("4 EMS buffers closed. Handle %d %d %d %d",a..3,b..3,c..3,d..3)

	;--- clear data buffer, thanx to mezala
        x=40/2,				;data buff/2
        (x){ x--, a..x-, }		;null by 2 bytes
	.

* P
01      "EMS buff str",15,4
        "A 1st string"
        "S 2nd string"
        "D 3rd string"
        "F 4th string"

*


    - No.8647 一括表示へ   -   コメント元:8638 一括表示へ  -    [ 返信 ]    [引用無し] pre


- 関連一覧ツリー (先頭の番号をクリックするとツリー全体を一括表示します)
▼ 8638.EMSテストマクロ - 文太 18/12/28-23:50
  ┣8639.Re: EMSテストマクロ - konno 18/12/29-21:59
  ┃┗8641.Re^2: EMSテストマクロ - 文太 18/12/30-12:09
  ┃ ┗8643.Re^3: EMSテストマクロ - konno 18/12/30-14:43
  ┃  ┗8646.Re^4: EMSテストマクロ - 文太 18/12/30-15:41
  ┗8647.EMS_buff.def (0.5) - 文太 18/12/30-23:39

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)   [引用無し]
おなまえ 
Eメール 
タイトル 
メッセージ auto soft pre(図表、プログラム) ※折り返さずに改行を入れてね
 参照先 
 暗証キー (英数字で8文字以内)
 プレビュー          

- 以下のフォームから自分の投稿記事を修正・削除することができます -
   処理   記事No   暗証キー
    [ページトップへ] [管理用]