ページへ戻る
印刷
gg00man/lib_getsig
をテンプレートにして作成 ::
OSASK計画
osaskwiki
:gg00man/lib_getsig をテンプレートにして作成
開始行:
* lib_getsigのページ
-(2004.05.05 by [[K]])
-みんなのソースを見ていると、誰もがgetsignal()やgetsignal...
-これを見て僕は反省しています。確かにgetsignalにはほとん...
-ということで、lib_getsig系の関数を作りました。良かったら...
*** ダウンロード
-osa_dir3以降にバンドルされますが、osa_dir3が出るまで待つ...
--[[test063>OSASK:6938]] (38.8KB)
--http://k.hideyosi.com/test062.lzh (26.3KB) ← 没
--http://k.hideyosi.com/test061.lzh (19.2KB) ← 没
* 関数一覧
-lib_initsignalbox系
--lib_initとlib_opensignalboxをくっつけたもの。
--だからこれ一つでlib_initもlib_opensignalboxも不要。
--これはmallocしないので、malloc領域の計算で数えなくてよ...
--lib_getsig系を使うにはこの関数でシグナルボックスを初期...
--従来どおりユーザが自作したgetsignal等を使うのなら、この...
--シグナルボックスのサイズに応じて関数名にバリエーション...
--lib_initsignalbox0_256(int rewind);
--lib_initsignalbox0_4k(int rewind);
--lib_initsignalbox0_64k(int rewind);
-lib_getsig系
--末尾にwが付いているのは、シグナルがくるまで待ってくれる...
--lib_getsig0(int *sigbox);
--lib_getsig0w(int *sigbox);
--lib_getsig1(int *sigbox);
--lib_getsig1w(int *sigbox);
--0版と1版の違いは、次の通り。
---ノーマル版とw版のどちらかしか使わないのなら、0版を使う...
---ノーマル版とw版の両方を使うなら、1版を使うほうが高速か...
-w版の動作説明用ソース
int getsignalw()
{
int sig;
retry:
sig = getsignal();
if (sig == 0) {
lib_waitsignal(0x0001, 0, 0); /* シグナルがくる...
goto retry;
}
return sig;
}
* 使用例
/* "movec2.c" */
/* stack:4k malloc:2k */
#include <guigui00.h>
#define AUTO_MALLOC 0
/* シグナルボックス関係 */
#define REWIND_CODE 1
#define initsignalbox() lib_initsignalbox0_256(REWIND_C...
#define getsignalw() lib_getsig0w(lib_sigbox_256)
void OsaskMain()
{
struct LIB_WINDOW *window;
struct LIB_TEXTBOX *wintitle, *textbox;
int x, y, c;
/* ライブラリ初期化&シグナルボックス初期化 */
initsignalbox();
/* ウィンドウオープン */
window = lib_openwindow(AUTO_MALLOC, 0x0200, 20 * 8,...
wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0, ...
textbox = lib_opentextbox(0x0001, AUTO_MALLOC, 0, 2...
lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "m...
/* シグナル定義 */
lib_definesignal1p0(3, 0x0100, 0x00ac, window, 4); /...
lib_definesignal1p0(0, 0x0100, ' ', window, 8); /...
lib_definesignal0p0(0, 0, 0, 0);
/* まず表示 */
x = 9; y = 3; c = 11;
lib_putstring_ASCII(0x0000, x, y, textbox, c, 0, "O");
/* メインループ */
for (;;) {
int ox = x, oy = y, oc = c, sig;
sig = getsignalw();
if (sig == 4) { /* left */
if (x > 0)
x--;
}
if (sig == 5) { /* right */
if (x < 19)
x++;
}
if (sig == 6) { /* up */
if (y > 0)
y--;
}
if (sig == 7) { /* down */
if (y < 7)
y++;
}
if (sig == 8) { /* chagne */
c = (c + 1) & 0x0f;
}
/* 何らかの変化があれば表示し直す */
if (x != ox || y != oy || c != oc) {
lib_putstring_ASCII(0x0000, ox, oy, textbox,...
lib_putstring_ASCII(0x0000, x, y, textbox,...
}
}
}
* マウスシグナルとかを扱いたい場合は?
-マウスシグナルとかを扱いたい場合、getparam系の関数が必要...
/* シグナルボックス関係 */
#define REWIND_CODE 1
#define initsignalbox() lib_initsignalbox0_4k(REWIND_CO...
#define getsignalw() lib_getsig0w(lib_sigbox_4k)
#define sig_ptr lib_sigptr_4k
-として、sig_ptrを使えるようにしてください(256でも64kで...
int getparam()
{
int param = *sig_ptr++;
lib_waitsignal(0x0000, 1, 0);
return param;
}
-もちろんgetparam系の関数など作らずに、たとえば、
x = sig_ptr[0];
y = sig_ptr[1];
sig_ptr += 2;
lib_waitsignal(0x0000, 2, 0);
-とやるほうがより高速です。
* lib_initsignalbox0_256の中身
-execcmd化の参考などに
void lib_initsignalbox0_256(int rewind)
{
static struct {
int rewind, dummy;
int *ptr;
int box[256 / 4]; /* ここが4kだったり64kだったり...
} sigstr = {
0, 0, sigstr.box, { 0 }
};
static struct LIB_WORK lib_work256;
sigstr.rewind = rewind; /* lib_getsigが参照するので...
lib_init_nm(&lib_work256);
lib_opensignalbox_nm(256, sigstr.box, 0, rewind);
}
/* sigstr.ptrがlib_sigptr_256, sigstr.boxがlib_sigbox_25...
* こめんと欄
-lib_initとlib_opensignalboxをくっつけるのはなんかビミョ...
-いい意見!lib_initの直後にlib_opensignalboxをやりなさい...
-いつものoptスイッチ仕様じゃなくて、サイズ別関数名にした...
-それは実は情けない理由があって、上記の例のように関数内に...
-ちなみに従来のgetsignalwの直接記述よりも常に優れていると...
-getsignalがあるならばput(send?)signalとかありそうだなど...
-微妙にページ違いな気がするので[[impressions]]に移動して...
-test062版なら実行ファイルもそれほどは大きくならないはず...
-test063+go_0023の最強の組み合わせでもサイズが大きくなっ...
#comment
終了行:
* lib_getsigのページ
-(2004.05.05 by [[K]])
-みんなのソースを見ていると、誰もがgetsignal()やgetsignal...
-これを見て僕は反省しています。確かにgetsignalにはほとん...
-ということで、lib_getsig系の関数を作りました。良かったら...
*** ダウンロード
-osa_dir3以降にバンドルされますが、osa_dir3が出るまで待つ...
--[[test063>OSASK:6938]] (38.8KB)
--http://k.hideyosi.com/test062.lzh (26.3KB) ← 没
--http://k.hideyosi.com/test061.lzh (19.2KB) ← 没
* 関数一覧
-lib_initsignalbox系
--lib_initとlib_opensignalboxをくっつけたもの。
--だからこれ一つでlib_initもlib_opensignalboxも不要。
--これはmallocしないので、malloc領域の計算で数えなくてよ...
--lib_getsig系を使うにはこの関数でシグナルボックスを初期...
--従来どおりユーザが自作したgetsignal等を使うのなら、この...
--シグナルボックスのサイズに応じて関数名にバリエーション...
--lib_initsignalbox0_256(int rewind);
--lib_initsignalbox0_4k(int rewind);
--lib_initsignalbox0_64k(int rewind);
-lib_getsig系
--末尾にwが付いているのは、シグナルがくるまで待ってくれる...
--lib_getsig0(int *sigbox);
--lib_getsig0w(int *sigbox);
--lib_getsig1(int *sigbox);
--lib_getsig1w(int *sigbox);
--0版と1版の違いは、次の通り。
---ノーマル版とw版のどちらかしか使わないのなら、0版を使う...
---ノーマル版とw版の両方を使うなら、1版を使うほうが高速か...
-w版の動作説明用ソース
int getsignalw()
{
int sig;
retry:
sig = getsignal();
if (sig == 0) {
lib_waitsignal(0x0001, 0, 0); /* シグナルがくる...
goto retry;
}
return sig;
}
* 使用例
/* "movec2.c" */
/* stack:4k malloc:2k */
#include <guigui00.h>
#define AUTO_MALLOC 0
/* シグナルボックス関係 */
#define REWIND_CODE 1
#define initsignalbox() lib_initsignalbox0_256(REWIND_C...
#define getsignalw() lib_getsig0w(lib_sigbox_256)
void OsaskMain()
{
struct LIB_WINDOW *window;
struct LIB_TEXTBOX *wintitle, *textbox;
int x, y, c;
/* ライブラリ初期化&シグナルボックス初期化 */
initsignalbox();
/* ウィンドウオープン */
window = lib_openwindow(AUTO_MALLOC, 0x0200, 20 * 8,...
wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0, ...
textbox = lib_opentextbox(0x0001, AUTO_MALLOC, 0, 2...
lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "m...
/* シグナル定義 */
lib_definesignal1p0(3, 0x0100, 0x00ac, window, 4); /...
lib_definesignal1p0(0, 0x0100, ' ', window, 8); /...
lib_definesignal0p0(0, 0, 0, 0);
/* まず表示 */
x = 9; y = 3; c = 11;
lib_putstring_ASCII(0x0000, x, y, textbox, c, 0, "O");
/* メインループ */
for (;;) {
int ox = x, oy = y, oc = c, sig;
sig = getsignalw();
if (sig == 4) { /* left */
if (x > 0)
x--;
}
if (sig == 5) { /* right */
if (x < 19)
x++;
}
if (sig == 6) { /* up */
if (y > 0)
y--;
}
if (sig == 7) { /* down */
if (y < 7)
y++;
}
if (sig == 8) { /* chagne */
c = (c + 1) & 0x0f;
}
/* 何らかの変化があれば表示し直す */
if (x != ox || y != oy || c != oc) {
lib_putstring_ASCII(0x0000, ox, oy, textbox,...
lib_putstring_ASCII(0x0000, x, y, textbox,...
}
}
}
* マウスシグナルとかを扱いたい場合は?
-マウスシグナルとかを扱いたい場合、getparam系の関数が必要...
/* シグナルボックス関係 */
#define REWIND_CODE 1
#define initsignalbox() lib_initsignalbox0_4k(REWIND_CO...
#define getsignalw() lib_getsig0w(lib_sigbox_4k)
#define sig_ptr lib_sigptr_4k
-として、sig_ptrを使えるようにしてください(256でも64kで...
int getparam()
{
int param = *sig_ptr++;
lib_waitsignal(0x0000, 1, 0);
return param;
}
-もちろんgetparam系の関数など作らずに、たとえば、
x = sig_ptr[0];
y = sig_ptr[1];
sig_ptr += 2;
lib_waitsignal(0x0000, 2, 0);
-とやるほうがより高速です。
* lib_initsignalbox0_256の中身
-execcmd化の参考などに
void lib_initsignalbox0_256(int rewind)
{
static struct {
int rewind, dummy;
int *ptr;
int box[256 / 4]; /* ここが4kだったり64kだったり...
} sigstr = {
0, 0, sigstr.box, { 0 }
};
static struct LIB_WORK lib_work256;
sigstr.rewind = rewind; /* lib_getsigが参照するので...
lib_init_nm(&lib_work256);
lib_opensignalbox_nm(256, sigstr.box, 0, rewind);
}
/* sigstr.ptrがlib_sigptr_256, sigstr.boxがlib_sigbox_25...
* こめんと欄
-lib_initとlib_opensignalboxをくっつけるのはなんかビミョ...
-いい意見!lib_initの直後にlib_opensignalboxをやりなさい...
-いつものoptスイッチ仕様じゃなくて、サイズ別関数名にした...
-それは実は情けない理由があって、上記の例のように関数内に...
-ちなみに従来のgetsignalwの直接記述よりも常に優れていると...
-getsignalがあるならばput(send?)signalとかありそうだなど...
-微妙にページ違いな気がするので[[impressions]]に移動して...
-test062版なら実行ファイルもそれほどは大きくならないはず...
-test063+go_0023の最強の組み合わせでもサイズが大きくなっ...
#comment
ページ名: