2: 2004-12-13 (月) 19:46:22 |
現: 2024-01-08 (月) 12:58:56 k-tan |
- | * wiki版のintroシリーズ no.0001 | + | TITLE:x |
| + | * wiki版のintroシリーズ no.0001 [#z51a3904] |
| -(by [[K]], 2004.12.13) | | -(by [[K]], 2004.12.13) |
| -これはC言語でもASKAでもnaskでもとにかくごちゃまぜでintroしてしまおうというこころみ。 | | -これはC言語でもASKAでもnaskでもとにかくごちゃまぜでintroしてしまおうというこころみ。 |
| --これは[[guide/wintro0000]]の続きなので、それを読んでない人はそれを読んでね。 | | --これは[[guide/wintro0000]]の続きなので、それを読んでない人はそれを読んでね。 |
- | ---最初から読みたい人は[[guide/ASKA]]や[[guide/nask]]からどうぞ。 | + | ---最初から読みたい人は[[guide/C]]や[[guide/ASKA]]や[[guide/nask]]からどうぞ。 |
| --C言語をやる人はintroaを読むといいでしょう。ここのプログラムは、introaと同一内容です。 | | --C言語をやる人はintroaを読むといいでしょう。ここのプログラムは、introaと同一内容です。 |
| -質問とか感想とかはこめんと欄にレッツゴー。 | | -質問とか感想とかはこめんと欄にレッツゴー。 |
| | | |
- | *** color | + | *** color [#q99770b1] |
- | -C版:"colorc1.c" [osa_dir2では 616バイト] | + | -C版:"colorc1.c" [tolset08では 546バイト] |
| + | //-C版:"colorc1.c" [osa_dir2では 615バイト] |
| /* "colorc1.c":colorをC言語で記述した例 */ | | /* "colorc1.c":colorをC言語で記述した例 */ |
- | /* stack:20k malloc:2k */ | + | /* stack:4k malloc:2k */ |
| + | |
| #include <guigui00.h> | | #include <guigui00.h> |
| #define AUTO_MALLOC 0 | | #define AUTO_MALLOC 0 |
| + | |
| void setdec2(const int i, char *s); | | void setdec2(const int i, char *s); |
| + | |
| void OsaskMain() | | void OsaskMain() |
| { | | { |
| int i; | | int i; |
| static char msg[] = "color 0"; | | static char msg[] = "color 0"; |
| + | |
| /* ライブラリ初期化 */ | | /* ライブラリ初期化 */ |
| lib_init(AUTO_MALLOC); | | lib_init(AUTO_MALLOC); |
| + | |
| /* ウィンドウのオープン */ | | /* ウィンドウのオープン */ |
| window = lib_openwindow(AUTO_MALLOC, 0x0200, 20 * 8, 8 * 16); | | window = lib_openwindow(AUTO_MALLOC, 0x0200, 20 * 8, 8 * 16); |
| textbox = lib_opentextbox(0x0001, AUTO_MALLOC, 0, 20, 8, 0, 0, window, 0x00c0, 0); | | textbox = lib_opentextbox(0x0001, AUTO_MALLOC, 0, 20, 8, 0, 0, window, 0x00c0, 0); |
| lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "colorc1"); | | lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "colorc1"); |
| + | |
| /* メインルーチン */ | | /* メインルーチン */ |
| for (i = 0; i < 16; i += 2) { | | for (i = 0; i < 16; i += 2) { |
| lib_putstring_ASCII(0x0000, 10, i / 2, textbox, i + 1, 0, msg); | | lib_putstring_ASCII(0x0000, 10, i / 2, textbox, i + 1, 0, msg); |
| } | | } |
| + | |
| /* 終了 */ | | /* 終了 */ |
| lib_waitsignal(0x0001, 0, 0); | | lib_waitsignal(0x0001, 0, 0); |
| } | | } |
| + | |
| void setdec2(const int i, char *s) | | void setdec2(const int i, char *s) |
| /* 注意:このルーチンでは、0~99までしか扱えない */ | | /* 注意:このルーチンでは、0~99までしか扱えない */ |
| return; | | return; |
| } | | } |
- | | + | |
- | -ASKA版:"colora1.ask" [osa_dir2では 240バイト] | + | -ASKA版:"colora1.ask" [tolset08では 210バイト] |
| + | //-ASKA版:"colora1.ask" [osa_dir2では 239バイト] |
| /* "colora1.ask":colorをASKAで記述した例 */ | | /* "colora1.ask":colorをASKAで記述した例 */ |
- | /* stack:20k malloc:0k */ | + | /* stack:4k malloc:0k */ |
| segment CODE(USE32, PARA); default(code == CODE); asmout("[FILE 'colora1.ask']"); | | segment CODE(USE32, PARA); default(code == CODE); asmout("[FILE 'colora1.ask']"); |
| asmout("GLOBAL _OsaskMain"); | | asmout("GLOBAL _OsaskMain"); |
| + | |
| void setdec2(); /* ALをDS:ESIに書き込む */ | | void setdec2(); /* ALをDS:ESIに書き込む */ |
| + | |
| void _OsaskMain() | | void _OsaskMain() |
| { | | { |
| asmout("MOV EBX,data.init"); CALL(0xc7, 0); | | asmout("MOV EBX,data.init"); CALL(0xc7, 0); |
| + | |
| unsigned char i == AL, x == CL, y == CH; | | unsigned char i == AL, x == CL, y == CH; |
| i = 0; | | i = 0; |
| i++; | | i++; |
| } while (i < 16); | | } while (i < 16); |
| + | |
| asmout("MOV EBX,data.sleep"); CALL(0xc7, 0); | | asmout("MOV EBX,data.sleep"); CALL(0xc7, 0); |
| } | | } |
| + | |
| void setdec2() | | void setdec2() |
| { | | { |
| return; | | return; |
| } | | } |
| + | |
| asmout("[SECTION .data]"); | | asmout("[SECTION .data]"); |
| + | |
| void data() | | void data() |
| { | | { |
| 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: |
| RESB(1280); /* 20x8文字分 (20 * 8 * 8) */ | | RESB(1280); /* 20x8文字分 (20 * 8 * 8) */ |
| } | | } |
| + | |
| | | |
- | | + | -nask版:"colorn1.nas" [tolset08では 209バイト] |
- | -nask版:"colorn1.nas" [osa_dir2では 238バイト] | + | //-nask版:"colorn1.nas" [osa_dir2では 237バイト] |
| ; "colorn1.nas":colorをnaskで記述した例 | | ; "colorn1.nas":colorをnaskで記述した例 |
- | ; stack:20k malloc:0k | + | ; stack:4k malloc:0k |
| + | |
| [FORMAT "WCOFF"] | | [FORMAT "WCOFF"] |
| [INSTRSET "i486p"] | | [INSTRSET "i486p"] |
| [BITS 32] | | [BITS 32] |
| [FILE "colorn1.nas"] | | [FILE "colorn1.nas"] |
| + | |
| [SECTION .text] | | [SECTION .text] |
| GLOBAL _OsaskMain | | GLOBAL _OsaskMain |
| + | |
| _OsaskMain: | | _OsaskMain: |
| MOV EBX,init | | MOV EBX,init |
| MOV EBX,sleep | | MOV EBX,sleep |
| CALL 0xc7:0 | | CALL 0xc7:0 |
| + | |
| setdec2: | | setdec2: |
| PUSH ECX | | PUSH ECX |
| POP ECX | | POP ECX |
| RET | | RET |
| + | |
| ; .で始まるラベルはローカルラベル。 | | ; .で始まるラベルはローカルラベル。 |
| ; ローカルラベルは、次のグローバルラベル宣言までが有効範囲。 | | ; ローカルラベルは、次のグローバルラベル宣言までが有効範囲。 |
| + | |
| [SECTION .data] | | [SECTION .data] |
| ALIGNB 4 | | ALIGNB 4 |
| 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: |
| textbox: | | textbox: |
| RESB 64 + 20 * 8 * 8; テキストボックス構造体(20x8文字分) | | RESB 64 + 20 * 8 * 8; テキストボックス構造体(20x8文字分) |
| + | |
| | | |
- | | + | *** 説明 [#n1fba734] |
- | *** 説明 | + | |
| -概要: | | -概要: |
| --このプログラムは、ウィンドウを一つ開き、そのウィンドウに16色のメッセージを表示するだけのプログラムです。 | | --このプログラムは、ウィンドウを一つ開き、そのウィンドウに16色のメッセージを表示するだけのプログラムです。 |
| --このプログラムを通じて、テキストに色を付ける方法と、数字表示の方法について説明します。 | | --このプログラムを通じて、テキストに色を付ける方法と、数字表示の方法について説明します。 |
- | --OSASKでは、printf()やitoa()などの便利な関数がまだ用意されていません。したがっ | + | --OSASKでは、printf()やitoa()などの便利な関数がまだ用意されていません。したがって、残念なことに数字を表示するのは少し面倒です。今回はitoaの代わりにsetdec2()という関数を作ってみました。 |
- | て、残念なことに数字を表示するのは少し面倒です。今回はitoaの代わりにsetdec2()という関数を作ってみました。 | + | |
| --これくらいの規模の例になると、CとASKAとnaskの文法の違いが出てきますので、見比べてみるのも面白いかもしれません。どれでもいいのですので、好きな言語を活用してください。 | | --これくらいの規模の例になると、CとASKAとnaskの文法の違いが出てきますので、見比べてみるのも面白いかもしれません。どれでもいいのですので、好きな言語を活用してください。 |
| | | |
| ---ASKA/naskのlib_putstring1も全く同様で、optの最下位ビットを1にすると、backcolorに0以外を指定できるようになります。 | | ---ASKA/naskのlib_putstring1も全く同様で、optの最下位ビットを1にすると、backcolorに0以外を指定できるようになります。 |
| | | |
- | *** まとめ | + | *** まとめ [#qffc9ebe] |
| -これで、テキストボックスを使った表示は一通りできるようになったはずです。許される範囲であちこちを改造して、把握してください。この程度のことなら、決して難しくないと感じていただけるはずです。 | | -これで、テキストボックスを使った表示は一通りできるようになったはずです。許される範囲であちこちを改造して、把握してください。この程度のことなら、決して難しくないと感じていただけるはずです。 |
| -なお、C版でテキストボックスを広げる際には、malloc領域が不足する可能性があるので、malloc:オプションの値を大きくしてやってください。ASKA/naskでは、テキストボックス構造体のサイズを間違えなければ、mallocは0kのままでかまいません。 | | -なお、C版でテキストボックスを広げる際には、malloc領域が不足する可能性があるので、malloc:オプションの値を大きくしてやってください。ASKA/naskでは、テキストボックス構造体のサイズを間違えなければ、mallocは0kのままでかまいません。 |
| | | |
- | *** おまけ | + | *** おまけ [#w6e221c1] |
| -次回(no.0002)は時間制御関係を少しやります。これで、変化のあるテキスト表示ができるようになるでしょう。 | | -次回(no.0002)は時間制御関係を少しやります。これで、変化のあるテキスト表示ができるようになるでしょう。 |
| + | -続編はこちら → [[guide/wintro0002]] |
| + | ~ |
| + | ~ |
| + | -''実際の開発をするにあたって'' |
| + | --このwintroシリーズを読んでいる人は、introシリーズを読んでいない可能性もあるので、大事な注意を書いておきます。 |
| + | --初心者がよくやることの一つに、プログラムをゼロから作り始めようとして失敗する、というのがあります。これは、いきなりプロジェクトを作って、まっさらなテキストファイルからプログラムを書いていく、ということを意味します。これはたいていうまくいきません。これはOSASKアプリ開発に限らず、他のOSのアプリ開発を最初にやろうとしたときもでも同じことです。 |
| + | --うまい方法は、まず、適当なサンプルアプリを見つけてきて(helloでもいいです)、それをコピーしたところから出発することです。これを少し改造し(たとえばウィンドウサイズとウィンドウタイトルを望みの大きさに変えて)、改造したらすぐに make run してみます。それでうまく動いたらバンザイです。さらに少し改造を加えて、自分の目的のアプリに近づけていきます。・・・もし make run してうまく動かなければ、どこが悪いのかをウンウンうなったりするのではなく、まずは動いていた段階に帰ります。そして少しずつ改造を戻していくことによって、どの変更で動かなくなったのかを突き止めるのです。 |
| + | --プログラムに経験があると過信している人ほど、この作業をやりません。まっさらなところから書き始めてつまづいて、それでそのプログラムを必至に眺めて、「おかしいところはないはずなんだけどなあ」とかいいます。もしくは、まめに make run するのをいやがって、一度にたくさん改造して、それでやっぱりバグを抱えて、何も分からなくなります。 |
| + | --この「こまめに make run 」「おかしくなったらつべこべ言わずに動いていた段階に一度戻る」を忠実に守った人が、一番速く上達します。初心者を脱した後でさえ、この方法で救われることを僕は何度も経験しています。 |
| + | --そんなわけで、僕としてはこの手法に沿った人からの質問にはできるだけ答えますが、そうでない人は自己努力不足ということで、十分な回答をしない場合があります。ご了承ください(これは具体的にどういうことかというと、問題あるソースだけではなく、問題なく動いていた段階のソースの提示を求めることがある、ということです)。 |
| + | |
| + | * こめんと欄 [#s8db1e95] |
| + | -tolset08にあわせて修正。 -- [[K]] SIZE(10){2005-01-29 (土) 15:34:36} |
| | | |
- | * こめんと欄 | + | //#comment |
- | #comment | + | |