4: 2004-12-13 (月) 19:47:23 [6] | 現: 2024-01-08 (月) 12:58:56 k-tan[7] [8] | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | * wiki版のintroシリーズ no.0000 | + | TITLE:x |
+ | * wiki版のintroシリーズ no.0000 [#da6ae250] | ||
-(by [[K]], 2004.12.13) | -(by [[K]], 2004.12.13) | ||
-これはC言語でもASKAでもnaskでもとにかくごちゃまぜでintroしてしまおうというこころみ。 | -これはC言語でもASKAでもnaskでもとにかくごちゃまぜでintroしてしまおうというこころみ。 | ||
- | --これは[[guide/ASKA]]や[[guide/nask]]の続きなので、それを読んでない人はそれを読んでね。 | + | --これは[[guide/C]]や[[guide/ASKA]]や[[guide/nask]]の続きなので、それを読んでない人はそれを読んでね。 |
--C言語をやる人はintroaを読むといいでしょう。ここのプログラムは、introaと同一内容です。 | --C言語をやる人はintroaを読むといいでしょう。ここのプログラムは、introaと同一内容です。 | ||
-質問とか感想とかはこめんと欄にレッツゴー(ページの一番下にあります)。 | -質問とか感想とかはこめんと欄にレッツゴー(ページの一番下にあります)。 | ||
- | *** hello, world | + | *** hello, world [#w4bfabe9] |
- | -C版:"helloc4.c" [osa_dir2では 509バイト] | + | //-C版:"helloc4.c" [osa_dir2では 509バイト] |
+ | -C版:"helloc4.c" [tolset08では 449バイト] | ||
/* "helloc4.c":helloをC言語で記述した例 */ | /* "helloc4.c":helloをC言語で記述した例 */ | ||
/* stack:4k malloc:1k */ | /* stack:4k malloc:1k */ | ||
+ | |||
#include <guigui00.h> | #include <guigui00.h> | ||
+ | |||
#define AUTO_MALLOC 0 | #define AUTO_MALLOC 0 | ||
+ | |||
void OsaskMain() | void OsaskMain() | ||
{ | { | ||
struct LIB_WINDOW *window; | struct LIB_WINDOW *window; | ||
struct LIB_TEXTBOX *wintitle, *textbox; | struct LIB_TEXTBOX *wintitle, *textbox; | ||
+ | |||
/* ライブラリの初期化(必ず最初にやらなければならない) */ | /* ライブラリの初期化(必ず最初にやらなければならない) */ | ||
lib_init(AUTO_MALLOC); | lib_init(AUTO_MALLOC); | ||
+ | |||
/* ウィンドウのオープン */ | /* ウィンドウのオープン */ | ||
window = lib_openwindow(AUTO_MALLOC, 0x0200, 136, 48); | window = lib_openwindow(AUTO_MALLOC, 0x0200, 136, 48); | ||
+ | |||
/* ウィンドウタイトル用のテキストボックスをオープン */ | /* ウィンドウタイトル用のテキストボックスをオープン */ | ||
wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0, 7, 1, 0, 0, window, 0x00c0, 0); | wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0, 7, 1, 0, 0, window, 0x00c0, 0); | ||
+ | |||
/* "hello, world"を表示するためのテキストボックスをオープン */ | /* "hello, world"を表示するためのテキストボックスをオープン */ | ||
textbox = lib_opentextbox(0x0000, AUTO_MALLOC, 0, 12, 1, 16, 16, window, 0x00c0, 0); | textbox = lib_opentextbox(0x0000, AUTO_MALLOC, 0, 12, 1, 16, 16, window, 0x00c0, 0); | ||
+ | |||
/* ウィンドウタイトルを表示 */ | /* ウィンドウタイトルを表示 */ | ||
lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "helloc4"); | lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "helloc4"); | ||
+ | |||
/* メッセージを表示 */ | /* メッセージを表示 */ | ||
lib_putstring_ASCII(0x0000, 0, 0, textbox, 0, 0, "hello, world"); | lib_putstring_ASCII(0x0000, 0, 0, textbox, 0, 0, "hello, world"); | ||
+ | |||
/* 終了 */ | /* 終了 */ | ||
lib_waitsignal(0x0001, 0, 0); | lib_waitsignal(0x0001, 0, 0); | ||
} | } | ||
- | + | ||
- | -ASKA版:"helloa4.ask" [osa_dir2では 171バイト] | + | //-ASKA版:"helloa4.ask" [osa_dir2では 171バイト] |
+ | -ASKA版:"helloa4.ask" [tolset08では 136バイト] | ||
/* "helloa4.ask":helloをASKAで記述した例 */ | /* "helloa4.ask":helloをASKAで記述した例 */ | ||
/* stack:4k malloc:0k */ | /* stack:4k malloc:0k */ | ||
segment CODE(USE32, PARA); default(code == CODE); asmout("[FILE 'helloa4.ask']"); | segment CODE(USE32, PARA); default(code == CODE); asmout("[FILE 'helloa4.ask']"); | ||
asmout("GLOBAL _OsaskMain"); | asmout("GLOBAL _OsaskMain"); | ||
+ | |||
void _OsaskMain() | void _OsaskMain() | ||
{ | { | ||
asmout("MOV EBX,data.funcs"); CALL(0xc7, 0); | asmout("MOV EBX,data.funcs"); CALL(0xc7, 0); | ||
} | } | ||
+ | |||
asmout("[SECTION .data]"); | asmout("[SECTION .data]"); | ||
+ | |||
void data() | void data() | ||
{ | { | ||
Line 67: | Line 70: | ||
DD(0x0018, 0x0001, 0, 0); /* lib_waitsignal */ | DD(0x0018, 0x0001, 0, 0); /* lib_waitsignal */ | ||
DD(0x0000); /* end of functions */ | DD(0x0000); /* end of functions */ | ||
+ | |||
ALIGNB(8); | ALIGNB(8); | ||
work: | work: | ||
Line 80: | Line 83: | ||
RESB(96); /* 12x1文字分 (12 * 1 * 8) */ | RESB(96); /* 12x1文字分 (12 * 1 * 8) */ | ||
} | } | ||
+ | |||
- | -nask版:"hellon4.nas" [osa_dir2では 170バイト] | + | //-nask版:"hellon4.nas" [osa_dir2では 170バイト] |
+ | -nask版:"hellon4.nas" [tolset08では 136バイト] | ||
; "hellon4.nas":helloをnaskで記述した例 | ; "hellon4.nas":helloをnaskで記述した例 | ||
; stack:4k malloc:0k | ; stack:4k malloc:0k | ||
+ | |||
[FORMAT "WCOFF"] | [FORMAT "WCOFF"] | ||
[INSTRSET "i486p"] | [INSTRSET "i486p"] | ||
Line 98: | Line 103: | ||
MOV EBX,funcs | MOV EBX,funcs | ||
CALL 0xc7:0 | CALL 0xc7:0 | ||
+ | |||
[SECTION .data] | [SECTION .data] | ||
ALIGNB 4 | ALIGNB 4 | ||
Line 110: | Line 115: | ||
DD 0x0018, 0x0001, 0, 0 ; lib_waitsignal | DD 0x0018, 0x0001, 0, 0 ; lib_waitsignal | ||
DD 0x0000 ; end of functions | DD 0x0000 ; end of functions | ||
+ | |||
ALIGNB 8 | ALIGNB 8 | ||
work: | work: | ||
Line 120: | Line 125: | ||
textbox: | textbox: | ||
RESB 64 + 12 * 1 * 8; テキストボックス構造体(12x1文字分) | RESB 64 + 12 * 1 * 8; テキストボックス構造体(12x1文字分) | ||
+ | |||
- | + | *** 説明 [#c1c5144f] | |
- | *** 説明 | + | |
-概要: | -概要: | ||
- | --このプログラムは、ウィンドウを一つ開き、そのウィンドウに"hello, world"と表示 | + | --このプログラムは、ウィンドウを一つ開き、そのウィンドウに"hello, world"と表示するだけのプログラムです。 |
- | するだけのプログラムです。 | + | |
--このプログラムを通じて、OSASKアプリケーションの基本的な作法を説明します。 | --このプログラムを通じて、OSASKアプリケーションの基本的な作法を説明します。 | ||
--OSASKアプリは基本的に、「ぐいぐい00ライブラリ」と呼ばれるライブラリを通じて、 | --OSASKアプリは基本的に、「ぐいぐい00ライブラリ」と呼ばれるライブラリを通じて、 | ||
- | ほとんどすべての入出力処理を行います。ですから、このライブラリの使い方をマスタ | + | ほとんどすべての入出力処理を行います。ですから、このライブラリの使い方をマスターすることが、OSASKアプリの作り方をマスターすることになります。 |
- | ーすることが、OSASKアプリの作り方をマスターすることになります。 | + | --OSASKでは、「ウィンドウ」に「テキストボックス」を貼付け、そのテキストボックスに文字を書くという手順で文字を表示します。ウィンドウに直接文字を書く方法はありません。 |
- | --OSASKでは、「ウィンドウ」に「テキストボックス」を貼付け、そのテキストボックス | + | --また文字を書くために、C言語では標準的なprintf()などを使うことはできません。特別な関数を使います。 |
- | に文字を書くという手順で文字を表示します。ウィンドウに直接文字を書く方法はあり | + | --なおプログラムを見ればすぐに分かっていただけると思いますが、OSASKアプリの標準的なメインルーチンは、int main();ではなく、void OsaskMain();です。またこの関数内でreturn;してはいけません。アプリケーションを終了するのは、APIを呼び出すことで行います。 |
- | ません。 | + | |
- | --また文字を書くために、C言語では標準的なprintf()などを使うことはできません。特 | + | |
- | 別な関数を使います。 | + | |
- | --なおプログラムを見ればすぐに分かっていただけると思いますが、OSASKアプリの標準 | + | |
- | 的なメインルーチンは、int main();ではなく、void OsaskMain();です。またこの関数 | + | |
- | 内でreturn;してはいけません。アプリケーションを終了するのは、APIを呼び出すこと | + | |
- | で行います。 | + | |
--stackとmallocについて説明します。プロジェクトを作ってMakefileを書き換えるとき、''STACKSIZE''と''MALLOCSIZE''という記述がすぐに見つかると思います。この記述をソースでの記載にそろえてください。なお、デフォルトではこのソースの値より大きいですが、実は大きい分にはあまり問題はありません。ソースでの記載よりも小さいと、誤動作の原因になります。それでも、無駄に大きいのはなんだかもったいないので、できればソースの記載にそろえることをおすすめします。 | --stackとmallocについて説明します。プロジェクトを作ってMakefileを書き換えるとき、''STACKSIZE''と''MALLOCSIZE''という記述がすぐに見つかると思います。この記述をソースでの記載にそろえてください。なお、デフォルトではこのソースの値より大きいですが、実は大きい分にはあまり問題はありません。ソースでの記載よりも小さいと、誤動作の原因になります。それでも、無駄に大きいのはなんだかもったいないので、できればソースの記載にそろえることをおすすめします。 | ||
--C版とASKA版を見比べると、まあまあ似ていることが分かります。ASKA版とnask版を比べるとほとんど同じです。したがって、C用の資料をASKAやnaskで活用することができますし、逆にASKA用の資料やnask用の資料をCで活用することもできます。 | --C版とASKA版を見比べると、まあまあ似ていることが分かります。ASKA版とnask版を比べるとほとんど同じです。したがって、C用の資料をASKAやnaskで活用することができますし、逆にASKA用の資料やnask用の資料をCで活用することもできます。 | ||
Line 183: | Line 180: | ||
ください。機能番号は0x0018です。 | ください。機能番号は0x0018です。 | ||
- | *** まとめ | + | |
+ | *** まとめ [#g11cfc5e] | ||
-これで好きな大きさのウィンドウを開き、ウィンドウにテキストボックスを貼り付けて、好きな色で文字をかけるようになったはずです。まだキー入力もタイマー制御もできないので、凝ったことはできませんが。 | -これで好きな大きさのウィンドウを開き、ウィンドウにテキストボックスを貼り付けて、好きな色で文字をかけるようになったはずです。まだキー入力もタイマー制御もできないので、凝ったことはできませんが。 | ||
-プログラムの終了のさせ方も分かったはずです。「面倒だから無限ループ」なんてしないで、ちゃんとlib_waitsignalしてください(見た目は同じようなものですが、負荷が大きく違いますから)。 | -プログラムの終了のさせ方も分かったはずです。「面倒だから無限ループ」なんてしないで、ちゃんとlib_waitsignalしてください(見た目は同じようなものですが、負荷が大きく違いますから)。 | ||
- | *** おまけ | + | *** おまけ [#ha341b52] |
-ここまではどれもただ芸もなく固定的なパラメータでAPIを呼び出しているだけですが、次(no.0001)からはパラメータに変数を使ったり、サブルーチンを作ったりします。 | -ここまではどれもただ芸もなく固定的なパラメータでAPIを呼び出しているだけですが、次(no.0001)からはパラメータに変数を使ったり、サブルーチンを作ったりします。 | ||
-続編はこちら → [[guide/wintro0001]] | -続編はこちら → [[guide/wintro0001]] | ||
Line 194: | Line 192: | ||
--http://k.osask.jp/wiki/index.php?nask/guide000 | --http://k.osask.jp/wiki/index.php?nask/guide000 | ||
- | * こめんと欄 | + | * こめんと欄 [#i3eab171] |
+ | -tolset08にあわせて修正。 -- [[K]] SIZE(10){2005-01-28 (金) 23:21:52} | ||
#comment | #comment |
(This host) = http://osask.net