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) */
}