ページへ戻る
印刷
gg00man/execcmd
をテンプレートにして作成 ::
OSASK計画
osaskwiki
:gg00man/execcmd をテンプレートにして作成
開始行:
* lib_execcmdを活用するためのページ
-(2004.05.04 by [[K]])
//--(このページは内容がある程度まとまったらMLでアナウンス...
-5/12も近づいて参りました。今年の512コンテストの一位はも...
-512バイトに収めるということになると、どうしてもアセンブ...
-まずは最新版<guigui00.h>を入手しましょう。これはosa_dir3...
--http://k.hideyosi.com/test062.lzh (26.3KB)
-さて結局のところ、アセンブラがC言語に対してやたらと有利...
* 原則
-lib_execcmdの使い方の基本形
-1.lib関数のうち、引数に変数が入っていないものを探す。値...
--たいていはこの状態になっていないと思うので、まずはこの...
--またlib関数が連続しているところが狙い目。単発のところは...
-2.この世界ではおなじみのVPマクロとVPSマクロを定義。
/* execcmd化ではおなじみのVPマクロ */
#define VP(x) (void *) (x)
#define VPS(a, b, c, d) (void *) (a | b << 8 | c ...
-3.次のようにlib関数をstatic void *の配列として展開。その...
lib_init_nm(&lib_work);
lib_openwindow_nm(&window, 0x200, 19 * 8, 4 * 16);
lib_opentextbox_nm(0x1000, &wintitle.tbox, 0, 7, 1, ...
↓
static void *cmd0[] = {
VP(LIB_FN_INIT), VP(&lib_work),
VP(LIB_FN_OPENWINDOW), VP(&window), VP(0x200), V...
VP(LIB_FN_OPENTEXTBOX), VP(0x1000), VP(&wintitle...
VP(0), VP(0), VP(&window), VP(0x00c0), VP(0),
VP(0x0000) /* 最後にこれを忘れずにね */
};
-4.あとはlib関数を呼んでいた場所で、lib_execcmd(cmd0);と...
* Q&A
-一ヶ所をexeccmd化したら全部execcmd化しないといけないの?
--そんなことないです。execcmd化したら小さくなるところだけ...
-なかなかexeccmd化できそうなところが見つけられません。
--最初のところが狙い目です。lib_initからシグナルボックス...
-下の関数表に出てない関数はどうやってexeccmd化するの?
--簡単にはexeccmd化できないので(やっても多分コンパクトに...
--lib_putstring_ASCIIは、まずlib_putstring1に書き換えてお...
-VPマクロは汚らしいので、こんな風にしてみましたどうですか?
#define _ (void *)
#define __(a, b, c, d) (void *) (a | b << 8 | c <...
static void *cmd0[] = {
_ LIB_FN_INIT, _ &lib_work,
_ LIB_FN_OPENWINDOW, _ &window, _ 0x200, _ (19 *...
_ LIB_FN_OPENTEXTBOX, _ 0x1000, _ &wintitle, _ 0...
_ 0x0000 /* 最後にこれを忘れずにね */
};
--こっちのほうがきれいかも?
* non-malloc化
-完全にnon-mallocにする必要はなくて、lib_execcmdの妨げに...
-LIB_WORKのnon-malloc化の例
static struct LIB_WORK lib_work;
/* これで lib_init_nm(&lib_work); とできるようにな...
-LIB_WINDOWのnon-malloc化の例
static struct LIB_WINDOW window;
/* これで lib_openwindow_nm(&window, 0x200, 19 * 8...
-LIB_TEXTBOXのnon-malloc化の例
static struct {
struct LIB_TEXTBOX tbox;
int data[7 * 1 * 8 / 4];
} wintitle;
/* これで VP(&wintitle) とすることでこのtextboxを...
/* dataの中の式の意味は、 xsize * ysize * 8 / 4 と...
-LIB_GRAPHBOXのnon-mallco化の例
static struct {
struct LIB_GRAPHBOX gbox;
int data[160 * 100];
} pic;
/* これで VP(&pic) とすることでこのgraphboxを表せ...
/* dataの中の式の意味は、 xsize * ysize という意味...
/* 表示上のサイズとバッファの大きさが違う場合は、 */
/* 表示上の大きさではなくバッファの大きさ */
/* 8bitグラフィックボックスならintではなくchar */
/* 16bitグラフィックボックスならintではなくshort */
-シグナルボックスのnon-malloc化の例
static int signalbox0[256 / 4], *sig_ptr = signalbox0;
/* これで lib_opensignalbox_nm(256, signalbox0, 0,...
/* だけでinit_signalbox(); の代わりになる */
-共通して言えるテクニック:
--一般に普通のlib関数でnon-malloc化したやつのポインタ(た...
struct LIB_TEXTBOX *ptbox = VP(&textbox);
などとstaticじゃない普通の変数にいったん代入して、execcmd...
* void *の配列への変換規則
-特に説明の必要がないほど簡単なもの
|lib_init|LIB_FN_INIT|non-malloc型|
|lib_close|LIB_FN_CLOSE||
|lib_waitsignal|LIB_FN_WAITSIGNAL||
|lib_waitsignaltime|LIB_FN_WAITSIGNALTIME||
|lib_openwindow|LIB_FN_OPENWINDOW|non-malloc型|
|lib_closewindow|LIB_FN_CLOSEWINDOW||
|lib_opentextbox|LIB_FN_OPENTEXTBOX|non-malloc型|
|lib_closetextbox|LIB_FN_CLOSETEXTBOX||
|lib_opnegraphbox|LIB_FN_OPENGRAPHBOX|non-malloc型|
|lib_opnegraphbox2|LIB_FN_OPENGRAPHBOX2|non-malloc型|
|lib_controlwindow|LIB_FN_CONTROLWINDOW||
|lib_drawline|LIB_FN_DRAWLINE||
|lib_drawline0|LIB_FN_DRAWLINE0||
|lib_opensignalbox|LIB_FN_OPENSIGNALBOX|non-malloc型|
|lib_opentimer|LIB_FN_OPENTIMER||
|lib_closetimer|LIB_FN_CLOSETIMER||
|lib_settimer|LIB_FN_SETTIMER||
|lib_settimertime|LIB_FN_SETTIMERTIME||
|lib_opensoundtrack|LIB_FN_OPENSOUNDTRAK||
|lib_controlfreq|LIB_FN_CONTROLFREQ||
|lib_loadfontset0|LIB_FN_LOADFONTSET0||
|lib_makecharset|LIB_FN_MAKECHARSET||
-ちょっと説明を要するもの
--lib_openwindow1 (LIB_FN_OPENWINDOW1)
---slotのところに1を足しておいてください(たとえばVP(0x20...
---flagのところは256倍した上にさらに1を足してください(た...
--lib_putstring0, lib_putstring1 (LIB_PUTSTRING)
---文字列の部分をそのままVP("test060")などとする場合は、o...
---一般にVPS展開するほうがコンパクトになります。VPS展開の...
---そしてVPSでないときは最後に0x000cを追加します。以下に...
---変換前:
lib_putstring1(0x1000, 0, 0, VP(&wintitle), 0, 0, 0, 7,...
---変換例1:
VP(LIB_FN_PUTSTRING), VP(0x1000 + 0x4000), VP(0), VP(0),...
VP(0), VP(0), VP(0), VP(7), VP("test060"), VP(0x000c),
---変換例2:
VP(LIB_FN_PUTSTRING), VP(0x1000), VP(0), VP(0), VP(&wint...
VP(0), VP(7), VPS('t', 'e', 's', 't'), VPS('0', '6',...
-lib_flushgraphbox (LIB_FN_FLUSHGRAPHBOX)
--最後に0x000cを追加。
-lib_putblock1 (LIB_FN_PUTBLOCK1)
--先頭にoptとして1を追加。最後に0x000cを追加。
-lib_drawpoints1 (LIB_FN_DRAWPOINTS1)
--最後に0x000cを追加。
-lib_drawpoint0 (LIB_FN_DRAWPOINT0)
--xとyのあとに、またxとyを追加(実はdrawline0でごまかして...
-lib_putblock02001 (LIB_FN_PUTBLOCK02001)
--先頭にoptとして0x2001を追加。
-lib_putblock02001 (LIB_FN_PUTBLOCK02001)
--先頭にoptとして0x2001を追加。
-lib_putblock02301 (LIB_FN_PUTBLOCK03001)
--先頭にoptとして0x3001を追加。
-lib_drawpoints0 (LIB_FN_DRAWPOINTS0)
--最後に0x000cを追加。
-lib_definesignal (LIB_FN_DEFINESIGNAL)
--0p0の場合は、最後に0を2つ追加
--1p0の場合は、signalの前に1を追加、signalの後ろに0を追加。
-lib_mapmodule (LIB_FN_MAPMODULE)
--addrの後ろに0x000cを追加、ofsとattrは足し算して一つに(...
-lib_unmapmodule (LIB_FN_UNMAPMODULE)
--addrの後ろに0x000cを追加。
-lib_loadfontset (LIB_FN_LOADFONTSET)
--最後に0x000cを追加。
-lib_wsjis2gg00jpn0 (LIB_FN_WSJIS2GG00JPN0)
--先頭にoptとして1を追加、sjisとgg00jpnの後ろにそれぞれ0x...
-lib_seuc2gg00 (LIB_FN_SEUC2GG00)
--先頭にoptとして2を追加、seucとgg00のうしろにそれぞれ0x0...
-lib_drawlines0 (LIB_FN_DRAWLINES0)
--最後に0x000cを追加。
-lib_convlines (LIB_FN_CONVLINES)
--最後に0x000cを追加。
-lib_drawlines1 (LIB_FN_DRAWLINES1)
--最後に0x000cを追加。
-lib_resizemodule (LIB_FN_RESIZEMODULE)
--sigの前に1を追加。
* こめんと欄
-guigui00.hをインラインアセンブラ化するってのはどうかな……...
#comment
終了行:
* lib_execcmdを活用するためのページ
-(2004.05.04 by [[K]])
//--(このページは内容がある程度まとまったらMLでアナウンス...
-5/12も近づいて参りました。今年の512コンテストの一位はも...
-512バイトに収めるということになると、どうしてもアセンブ...
-まずは最新版<guigui00.h>を入手しましょう。これはosa_dir3...
--http://k.hideyosi.com/test062.lzh (26.3KB)
-さて結局のところ、アセンブラがC言語に対してやたらと有利...
* 原則
-lib_execcmdの使い方の基本形
-1.lib関数のうち、引数に変数が入っていないものを探す。値...
--たいていはこの状態になっていないと思うので、まずはこの...
--またlib関数が連続しているところが狙い目。単発のところは...
-2.この世界ではおなじみのVPマクロとVPSマクロを定義。
/* execcmd化ではおなじみのVPマクロ */
#define VP(x) (void *) (x)
#define VPS(a, b, c, d) (void *) (a | b << 8 | c ...
-3.次のようにlib関数をstatic void *の配列として展開。その...
lib_init_nm(&lib_work);
lib_openwindow_nm(&window, 0x200, 19 * 8, 4 * 16);
lib_opentextbox_nm(0x1000, &wintitle.tbox, 0, 7, 1, ...
↓
static void *cmd0[] = {
VP(LIB_FN_INIT), VP(&lib_work),
VP(LIB_FN_OPENWINDOW), VP(&window), VP(0x200), V...
VP(LIB_FN_OPENTEXTBOX), VP(0x1000), VP(&wintitle...
VP(0), VP(0), VP(&window), VP(0x00c0), VP(0),
VP(0x0000) /* 最後にこれを忘れずにね */
};
-4.あとはlib関数を呼んでいた場所で、lib_execcmd(cmd0);と...
* Q&A
-一ヶ所をexeccmd化したら全部execcmd化しないといけないの?
--そんなことないです。execcmd化したら小さくなるところだけ...
-なかなかexeccmd化できそうなところが見つけられません。
--最初のところが狙い目です。lib_initからシグナルボックス...
-下の関数表に出てない関数はどうやってexeccmd化するの?
--簡単にはexeccmd化できないので(やっても多分コンパクトに...
--lib_putstring_ASCIIは、まずlib_putstring1に書き換えてお...
-VPマクロは汚らしいので、こんな風にしてみましたどうですか?
#define _ (void *)
#define __(a, b, c, d) (void *) (a | b << 8 | c <...
static void *cmd0[] = {
_ LIB_FN_INIT, _ &lib_work,
_ LIB_FN_OPENWINDOW, _ &window, _ 0x200, _ (19 *...
_ LIB_FN_OPENTEXTBOX, _ 0x1000, _ &wintitle, _ 0...
_ 0x0000 /* 最後にこれを忘れずにね */
};
--こっちのほうがきれいかも?
* non-malloc化
-完全にnon-mallocにする必要はなくて、lib_execcmdの妨げに...
-LIB_WORKのnon-malloc化の例
static struct LIB_WORK lib_work;
/* これで lib_init_nm(&lib_work); とできるようにな...
-LIB_WINDOWのnon-malloc化の例
static struct LIB_WINDOW window;
/* これで lib_openwindow_nm(&window, 0x200, 19 * 8...
-LIB_TEXTBOXのnon-malloc化の例
static struct {
struct LIB_TEXTBOX tbox;
int data[7 * 1 * 8 / 4];
} wintitle;
/* これで VP(&wintitle) とすることでこのtextboxを...
/* dataの中の式の意味は、 xsize * ysize * 8 / 4 と...
-LIB_GRAPHBOXのnon-mallco化の例
static struct {
struct LIB_GRAPHBOX gbox;
int data[160 * 100];
} pic;
/* これで VP(&pic) とすることでこのgraphboxを表せ...
/* dataの中の式の意味は、 xsize * ysize という意味...
/* 表示上のサイズとバッファの大きさが違う場合は、 */
/* 表示上の大きさではなくバッファの大きさ */
/* 8bitグラフィックボックスならintではなくchar */
/* 16bitグラフィックボックスならintではなくshort */
-シグナルボックスのnon-malloc化の例
static int signalbox0[256 / 4], *sig_ptr = signalbox0;
/* これで lib_opensignalbox_nm(256, signalbox0, 0,...
/* だけでinit_signalbox(); の代わりになる */
-共通して言えるテクニック:
--一般に普通のlib関数でnon-malloc化したやつのポインタ(た...
struct LIB_TEXTBOX *ptbox = VP(&textbox);
などとstaticじゃない普通の変数にいったん代入して、execcmd...
* void *の配列への変換規則
-特に説明の必要がないほど簡単なもの
|lib_init|LIB_FN_INIT|non-malloc型|
|lib_close|LIB_FN_CLOSE||
|lib_waitsignal|LIB_FN_WAITSIGNAL||
|lib_waitsignaltime|LIB_FN_WAITSIGNALTIME||
|lib_openwindow|LIB_FN_OPENWINDOW|non-malloc型|
|lib_closewindow|LIB_FN_CLOSEWINDOW||
|lib_opentextbox|LIB_FN_OPENTEXTBOX|non-malloc型|
|lib_closetextbox|LIB_FN_CLOSETEXTBOX||
|lib_opnegraphbox|LIB_FN_OPENGRAPHBOX|non-malloc型|
|lib_opnegraphbox2|LIB_FN_OPENGRAPHBOX2|non-malloc型|
|lib_controlwindow|LIB_FN_CONTROLWINDOW||
|lib_drawline|LIB_FN_DRAWLINE||
|lib_drawline0|LIB_FN_DRAWLINE0||
|lib_opensignalbox|LIB_FN_OPENSIGNALBOX|non-malloc型|
|lib_opentimer|LIB_FN_OPENTIMER||
|lib_closetimer|LIB_FN_CLOSETIMER||
|lib_settimer|LIB_FN_SETTIMER||
|lib_settimertime|LIB_FN_SETTIMERTIME||
|lib_opensoundtrack|LIB_FN_OPENSOUNDTRAK||
|lib_controlfreq|LIB_FN_CONTROLFREQ||
|lib_loadfontset0|LIB_FN_LOADFONTSET0||
|lib_makecharset|LIB_FN_MAKECHARSET||
-ちょっと説明を要するもの
--lib_openwindow1 (LIB_FN_OPENWINDOW1)
---slotのところに1を足しておいてください(たとえばVP(0x20...
---flagのところは256倍した上にさらに1を足してください(た...
--lib_putstring0, lib_putstring1 (LIB_PUTSTRING)
---文字列の部分をそのままVP("test060")などとする場合は、o...
---一般にVPS展開するほうがコンパクトになります。VPS展開の...
---そしてVPSでないときは最後に0x000cを追加します。以下に...
---変換前:
lib_putstring1(0x1000, 0, 0, VP(&wintitle), 0, 0, 0, 7,...
---変換例1:
VP(LIB_FN_PUTSTRING), VP(0x1000 + 0x4000), VP(0), VP(0),...
VP(0), VP(0), VP(0), VP(7), VP("test060"), VP(0x000c),
---変換例2:
VP(LIB_FN_PUTSTRING), VP(0x1000), VP(0), VP(0), VP(&wint...
VP(0), VP(7), VPS('t', 'e', 's', 't'), VPS('0', '6',...
-lib_flushgraphbox (LIB_FN_FLUSHGRAPHBOX)
--最後に0x000cを追加。
-lib_putblock1 (LIB_FN_PUTBLOCK1)
--先頭にoptとして1を追加。最後に0x000cを追加。
-lib_drawpoints1 (LIB_FN_DRAWPOINTS1)
--最後に0x000cを追加。
-lib_drawpoint0 (LIB_FN_DRAWPOINT0)
--xとyのあとに、またxとyを追加(実はdrawline0でごまかして...
-lib_putblock02001 (LIB_FN_PUTBLOCK02001)
--先頭にoptとして0x2001を追加。
-lib_putblock02001 (LIB_FN_PUTBLOCK02001)
--先頭にoptとして0x2001を追加。
-lib_putblock02301 (LIB_FN_PUTBLOCK03001)
--先頭にoptとして0x3001を追加。
-lib_drawpoints0 (LIB_FN_DRAWPOINTS0)
--最後に0x000cを追加。
-lib_definesignal (LIB_FN_DEFINESIGNAL)
--0p0の場合は、最後に0を2つ追加
--1p0の場合は、signalの前に1を追加、signalの後ろに0を追加。
-lib_mapmodule (LIB_FN_MAPMODULE)
--addrの後ろに0x000cを追加、ofsとattrは足し算して一つに(...
-lib_unmapmodule (LIB_FN_UNMAPMODULE)
--addrの後ろに0x000cを追加。
-lib_loadfontset (LIB_FN_LOADFONTSET)
--最後に0x000cを追加。
-lib_wsjis2gg00jpn0 (LIB_FN_WSJIS2GG00JPN0)
--先頭にoptとして1を追加、sjisとgg00jpnの後ろにそれぞれ0x...
-lib_seuc2gg00 (LIB_FN_SEUC2GG00)
--先頭にoptとして2を追加、seucとgg00のうしろにそれぞれ0x0...
-lib_drawlines0 (LIB_FN_DRAWLINES0)
--最後に0x000cを追加。
-lib_convlines (LIB_FN_CONVLINES)
--最後に0x000cを追加。
-lib_drawlines1 (LIB_FN_DRAWLINES1)
--最後に0x000cを追加。
-lib_resizemodule (LIB_FN_RESIZEMODULE)
--sigの前に1を追加。
* こめんと欄
-guigui00.hをインラインアセンブラ化するってのはどうかな……...
#comment
ページ名: