7: 2009-11-17 (火) 12:08:17 |
現: 2024-01-08 (月) 12:58:56 lina |
- | * wiki版のintroシリーズ no.0003 | + | TITLE:x |
| + | * wiki版のintroシリーズ no.0003 [#sbcac025] |
| -(by [[K]], 2005.01.28) | | -(by [[K]], 2005.01.28) |
| -これはC言語でもASKAでもnaskでもとにかくごちゃまぜでintroしてしまおうというこころみ。 | | -これはC言語でもASKAでもnaskでもとにかくごちゃまぜでintroしてしまおうというこころみ。 |
| -質問とか感想とかはこめんと欄にレッツゴー。 | | -質問とか感想とかはこめんと欄にレッツゴー。 |
| | | |
- | *** move | + | *** move [#q811a16f] |
| -C版:"movec2.c" [tolset08では 681バイト] | | -C版:"movec2.c" [tolset08では 681バイト] |
| /* "movec2.c" */ | | /* "movec2.c" */ |
| /* stack:4k malloc:2k */ | | /* stack:4k malloc:2k */ |
| + | |
| #include <guigui00.h> | | #include <guigui00.h> |
| + | |
| #define AUTO_MALLOC 0 | | #define AUTO_MALLOC 0 |
| #define REWIND_CODE 1 | | #define REWIND_CODE 1 |
| + | |
| static int *signalbox0, *sig_ptr; | | static int *signalbox0, *sig_ptr; |
| void initsignalbox(); | | void initsignalbox(); |
| int getsignal(); | | int getsignal(); |
| + | |
| void OsaskMain() | | void OsaskMain() |
| { | | { |
| struct LIB_TEXTBOX *wintitle, *textbox; | | struct LIB_TEXTBOX *wintitle, *textbox; |
| int x, y, c; | | int x, y, c; |
| + | |
| /* ライブラリ初期化 */ | | /* ライブラリ初期化 */ |
| lib_init(AUTO_MALLOC); | | lib_init(AUTO_MALLOC); |
| + | |
| /* シグナルボックス初期化 */ | | /* シグナルボックス初期化 */ |
| initsignalbox(); | | initsignalbox(); |
| + | |
| /* ウィンドウオープン */ | | /* ウィンドウオープン */ |
| 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, "movec2"); | | lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "movec2"); |
| + | |
| /* シグナル定義 */ | | /* シグナル定義 */ |
| lib_definesignal1p0(3, 0x0100, 0x00ac, window, 4); /* カーソルキー(計4つ) */ | | lib_definesignal1p0(3, 0x0100, 0x00ac, window, 4); /* カーソルキー(計4つ) */ |
| lib_definesignal1p0(0, 0x0100, ' ', window, 8); /* スペースバー */ | | lib_definesignal1p0(0, 0x0100, ' ', window, 8); /* スペースバー */ |
| lib_definesignal0p0(0, 0, 0, 0); | | lib_definesignal0p0(0, 0, 0, 0); |
| + | |
| /* まず表示 */ | | /* まず表示 */ |
| x = 9; y = 3; c = 11; | | x = 9; y = 3; c = 11; |
| lib_putstring_ASCII(0x0000, x, y, textbox, c, 0, "O"); | | lib_putstring_ASCII(0x0000, x, y, textbox, c, 0, "O"); |
| + | |
| /* メインループ */ | | /* メインループ */ |
| for (;;) { | | for (;;) { |
| int ox = x, oy = y, oc = c; | | int ox = x, oy = y, oc = c; |
| + | |
| switch (getsignal()) { | | switch (getsignal()) { |
| case 0: | | case 0: |
| lib_waitsignal(0x0001, 0, 0); | | lib_waitsignal(0x0001, 0, 0); |
| continue; | | continue; |
| + | |
| case 4 /* left */: | | case 4 /* left */: |
| if (x > 0) | | if (x > 0) |
| x--; | | x--; |
| break; | | break; |
| + | |
| case 5 /* right */: | | case 5 /* right */: |
| if (x < 19) | | if (x < 19) |
| x++; | | x++; |
| break; | | break; |
| + | |
| case 6 /* up */: | | case 6 /* up */: |
| if (y > 0) | | if (y > 0) |
| y--; | | y--; |
| break; | | break; |
| + | |
| case 7 /* down */: | | case 7 /* down */: |
| if (y < 7) | | if (y < 7) |
| y++; | | y++; |
| break; | | break; |
| + | |
| case 8 /* change */: | | case 8 /* change */: |
| c = (c + 1) & 0x0f; | | c = (c + 1) & 0x0f; |
| break; | | break; |
| } | | } |
| + | |
| /* 何らかの変化があれば表示し直す */ | | /* 何らかの変化があれば表示し直す */ |
| if (x != ox || y != oy || c != oc) { | | if (x != ox || y != oy || c != oc) { |
| } | | } |
| } | | } |
| + | |
| void initsignalbox() | | void initsignalbox() |
| /* シグナルボックス初期化 */ | | /* シグナルボックス初期化 */ |
| return; | | return; |
| } | | } |
| + | |
| int getsignal() | | int getsignal() |
| /* 0が返されたら、シグナルなし */ | | /* 0が返されたら、シグナルなし */ |
| return signal; | | return signal; |
| } | | } |
| + | |
| -''(以下未編集)'' | | -''(以下未編集)'' |
| -ASKA版:"cntdwna1.ask" [osa_dir2では 249バイト] | | -ASKA版:"cntdwna1.ask" [osa_dir2では 249バイト] |
| segment CODE(USE32, PARA); default(code == CODE); asmout("[FILE 'cntdwna1.ask']"); | | segment CODE(USE32, PARA); default(code == CODE); asmout("[FILE 'cntdwna1.ask']"); |
| asmout("GLOBAL _OsaskMain"); | | asmout("GLOBAL _OsaskMain"); |
| + | |
| void setdec3(); /* EAXをDS:ESIに書き込む */ | | void setdec3(); /* EAXをDS:ESIに書き込む */ |
| + | |
| void _OsaskMain() | | void _OsaskMain() |
| { | | { |
| asmout("MOV EBX,data.init"); CALL(0xc7, 0); | | asmout("MOV EBX,data.init"); CALL(0xc7, 0); |
| + | |
| for (;;) { | | for (;;) { |
| unsigned int count == EAX; | | unsigned int count == EAX; |
| } | | } |
| } | | } |
| + | |
| void setdec3() | | void setdec3() |
| { | | { |
| return; | | return; |
| } | | } |
| + | |
| asmout("[SECTION .data]"); | | asmout("[SECTION .data]"); |
| + | |
| void data() | | void data() |
| { | | { |
| DD(0x0018, 0x0007, 0, 0, 0, 10, 0); /* lib_waitsignaltime */ | | DD(0x0018, 0x0007, 0, 0, 0, 10, 0); /* lib_waitsignaltime */ |
| DD(0x0000); /* end of functions */ | | DD(0x0000); /* end of functions */ |
| + | |
| ALIGNB(8); | | ALIGNB(8); |
| work: | | work: |
| RESB(24); /* 3x1文字分 (3 * 1 * 8) */ | | RESB(24); /* 3x1文字分 (3 * 1 * 8) */ |
| } | | } |
| + | |
| | | |
| -nask版:"cntdwnn1.nas" [osa_dir2では 251バイト] | | -nask版:"cntdwnn1.nas" [osa_dir2では 251バイト] |
| ; "cntdwnn1.nas":countdwnをnaskで記述した例 | | ; "cntdwnn1.nas":countdwnをnaskで記述した例 |
| ; stack:4k malloc:0k | | ; stack:4k malloc:0k |
| + | |
| [FORMAT "WCOFF"] | | [FORMAT "WCOFF"] |
| [INSTRSET "i486p"] | | [INSTRSET "i486p"] |
| [BITS 32] | | [BITS 32] |
| [FILE "cntdwnn1.nas"] | | [FILE "cntdwnn1.nas"] |
| + | |
| [SECTION .text] | | [SECTION .text] |
| GLOBAL _OsaskMain | | GLOBAL _OsaskMain |
| + | |
| _OsaskMain: | | _OsaskMain: |
| MOV EBX,init | | MOV EBX,init |
| CALL 0xc7:0 | | CALL 0xc7:0 |
| JMP .mainloop | | JMP .mainloop |
| + | |
| setdec3: | | setdec3: |
| PUSH EDX | | PUSH EDX |
| POP EDX | | POP EDX |
| RET | | RET |
| + | |
| [SECTION .data] | | [SECTION .data] |
| ALIGNB 4 | | ALIGNB 4 |
| DD 0x0018, 0x0007, 0, 0, 0, 10, 0 ; lib_waitsignaltime | | DD 0x0018, 0x0007, 0, 0, 0, 10, 0 ; lib_waitsignaltime |
| DD 0x0000 ; end of functions | | DD 0x0000 ; end of functions |
| + | |
| ALIGNB 8 | | ALIGNB 8 |
| work: | | work: |
| textbox: | | textbox: |
| RESB 64 + 3 * 1 * 8; テキストボックス構造体(3x1文字分) | | RESB 64 + 3 * 1 * 8; テキストボックス構造体(3x1文字分) |
| + | |
| | | |
- | | + | *** 説明 [#m286c5df] |
- | *** 説明 | + | |
| -概要: | | -概要: |
| --このプログラムは、ウィンドウを一つ開き、そのウィンドウに1秒おきに数字を表示していくだけのプログラムです。 | | --このプログラムは、ウィンドウを一つ開き、そのウィンドウに1秒おきに数字を表示していくだけのプログラムです。 |
| ---この時間間隔指定ですが、少なくとも10ミリ秒以上はあってほしいです。これは何も10ミリ秒単位であることを要請しているわけでありません。11.52ミリ秒などでもかまいません。また頻繁に繰り替えすことがないのなら、10ミリ秒を下回ってもかまいません。将来のOSASKでは、連続して何度も10ミリ秒以下の指定をした場合、OS側で強制的に10ミリ秒間間隔に補正される可能性があります。現在のOSASKでは、OSの動作が不安定になります。ですからやってはいけません。 | | ---この時間間隔指定ですが、少なくとも10ミリ秒以上はあってほしいです。これは何も10ミリ秒単位であることを要請しているわけでありません。11.52ミリ秒などでもかまいません。また頻繁に繰り替えすことがないのなら、10ミリ秒を下回ってもかまいません。将来のOSASKでは、連続して何度も10ミリ秒以下の指定をした場合、OS側で強制的に10ミリ秒間間隔に補正される可能性があります。現在のOSASKでは、OSの動作が不安定になります。ですからやってはいけません。 |
| | | |
- | *** まとめ | + | *** まとめ [#q37b9541] |
| -これで時間を細かく制御できるようになるはずです。時間とともに表示を操作すれば動きのある表示(アニメーション)ができるでしょう。ここまでのところではテキストしか扱えないので、テキストアニメーションしかできませんが。それでも、少しは遊べるはずです。もねさんがすぐに「msg00」や「msg01」を作ったのもうなずけます。 | | -これで時間を細かく制御できるようになるはずです。時間とともに表示を操作すれば動きのある表示(アニメーション)ができるでしょう。ここまでのところではテキストしか扱えないので、テキストアニメーションしかできませんが。それでも、少しは遊べるはずです。もねさんがすぐに「msg00」や「msg01」を作ったのもうなずけます。 |
| -精密な時間制御が比較的簡単にできることはOSASKアプリの特徴の一つです。他のOSよりも簡単にマスターできることでしょう。 | | -精密な時間制御が比較的簡単にできることはOSASKアプリの特徴の一つです。他のOSよりも簡単にマスターできることでしょう。 |
| | | |
- | *** おまけ | + | *** おまけ [#he570757] |
| -次回(no.0003)はキー入力を少しやります。これで、キー入力を反映できるようになるでしょう。 | | -次回(no.0003)はキー入力を少しやります。これで、キー入力を反映できるようになるでしょう。 |
| -読んでいる人が追いつけないほど先に進んでもしょうがないので、こめんと欄でリクエストがきたら次回を書き始めます。 | | -読んでいる人が追いつけないほど先に進んでもしょうがないので、こめんと欄でリクエストがきたら次回を書き始めます。 |
| | | |
- | * こめんと欄 | + | * こめんと欄 [#t55d4c88] |
| -シグナルとは何でしょう?APIリファレンスも見ていましたが、シグナルの概念がよく分かりません(汗。 -- ''nika'' SIZE(10){2005-02-02 (水) 04:11:58} | | -シグナルとは何でしょう?APIリファレンスも見ていましたが、シグナルの概念がよく分かりません(汗。 -- ''nika'' SIZE(10){2005-02-02 (水) 04:11:58} |
| -それはこれから書くことですので、このページが出来上がるまで(=''以下未編集''の表示が消えるまで)のんびりとお待ちください。 -- [[K]] SIZE(10){2005-02-02 (水) 13:16:38} | | -それはこれから書くことですので、このページが出来上がるまで(=''以下未編集''の表示が消えるまで)のんびりとお待ちください。 -- [[K]] SIZE(10){2005-02-02 (水) 13:16:38} |
| | | |
| #comment | | #comment |