TARGET = askahelo
segment CODE(USE32, PARA); /* おまじない */ default(code == CODE); /* おまじない */ asmout("[FILE 'askahelo.ask']"); /* nask編参照 */ asmout("GLOBAL _OsaskMain"); /* 最初の[SECTION .text]は省略可能なので省略 */ void _OsaskMain() { asmout("MOV EBX,data.func_init"); /* ASKAはラベルへのgoto以外はうまくできないので、やむなくasmout。 */ CALL(0xc7, 0); asmout("MOV EBX,data.func_openwin"); CALL(0xc7, 0); asmout("MOV EBX,data.func_titlebox"); CALL(0xc7, 0); asmout("MOV EBX,data.func_settitle"); CALL(0xc7, 0); asmout("MOV EBX,data.func_sleep"); CALL(0xc7, 0); /* 永久スリープなので帰ってこない */ } asmout("[SECTION .data]"); void data() { ALIGNB(4); func_init: asmout("DD 0x0004, data.work, 0x0000"); /* ファンクション番号0x04(API初期化), ワークエリアのポインタ, 終了ファンクション番号0x00 */ func_openwin: asmout("DD 0x0020, data.window, 0x0200, 18 * 8, 3 * 16, 0x0000"); /* ファンクション番号0x20(ウィンドウオープン), window構造体のポインタ, スロット番号0x200, xサイズ(ドット単位), yサイズ(ドット単位), 終了ファンクション番号0x00 */ func_titlebox: asmout("DD 0x0028, 0x1000, data.wintitle, 0, 8, 1, 0, 0, data.window, 0x00c0, 0, 0x0000"); /* ファンクション番号0x28(テキストボックスオープン), オプション0x1000(ウィンドウタイトルモード), textbox構造体のポインタ, 背景色0, xサイズ(キャラクタ単位), yサイズ(キャラクタ単位), 表示x位置0, 表示y位置0, window構造体のポインタ, 標準キャラクタセット使用(0x00c0), 空白キャラクタ0, 終了ファンクション番号0x00 */ func_settitle: asmout("DD 0x0040, 0x1000, 0, 0, data.wintitle, 0, 0, 0, 8, 'askahelo', 0x0000"); /* ファクション番号0x40(テキスト表示), オプション0x1000(8bitキャラクタモード), 表示x位置0, 表示y位置0, textbox構造体のポインタ, 文字色0, 背景色0, キャラクタコードオフセット0, 文字数8, 文字列"naskhelo", 終了ファンクション番号0x00 */ func_sleep: DD(0x0018, 0x0001, 0, 0, 0x0000); /* ファンクション番号0x0018(シグナル関係の処理), オプション1(スリープ), パラメータ0, パラメータ0, 終了ファンクション番号0x00 */ ALIGNB(16); /* align8で十分だった気がするけど、なんとなく気分で */ work: RESB(256); /* func_initに必要な256バイトのワークエリア */ window: RESB(128); /* ウィンドウ構造体 */ wintitle: RESB(64); /* テキストボックス構造体 */ RESB(64); /* 8文字分 (8 * 1 * 8) */ }
PUSH(0); asmout("PUSH data.work"); PUSH(4); EBX = ESP; CALL(0xc7, 0); ESP += 12;
(This host) = http://osask.net