6: 2005-02-02 (水) 13:16:38 [6] | 現: 2024-01-08 (月) 12:58:56 lina[7] [8] | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | * 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してしまおうというこころみ。 | ||
Line 7: | Line 8: | ||
-質問とか感想とかはこめんと欄にレッツゴー。 | -質問とか感想とかはこめんと欄にレッツゴー。 | ||
- | *** 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() | ||
{ | { | ||
Line 26: | Line 27: | ||
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); | ||
Line 38: | Line 39: | ||
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: | ||
Line 57: | Line 58: | ||
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 /* rigth */: | + | 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 /* chagne */: | + | 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) { | ||
Line 90: | Line 91: | ||
} | } | ||
} | } | ||
+ | |||
void initsignalbox() | void initsignalbox() | ||
/* シグナルボックス初期化 */ | /* シグナルボックス初期化 */ | ||
Line 97: | Line 98: | ||
return; | return; | ||
} | } | ||
+ | |||
int getsignal() | int getsignal() | ||
/* 0が返されたら、シグナルなし */ | /* 0が返されたら、シグナルなし */ | ||
Line 116: | Line 117: | ||
return signal; | return signal; | ||
} | } | ||
+ | |||
-''(以下未編集)'' | -''(以下未編集)'' | ||
-ASKA版:"cntdwna1.ask" [osa_dir2では 249バイト] | -ASKA版:"cntdwna1.ask" [osa_dir2では 249バイト] | ||
Line 123: | Line 124: | ||
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; | ||
Line 144: | Line 145: | ||
} | } | ||
} | } | ||
+ | |||
void setdec3() | void setdec3() | ||
{ | { | ||
Line 170: | Line 171: | ||
return; | return; | ||
} | } | ||
+ | |||
asmout("[SECTION .data]"); | asmout("[SECTION .data]"); | ||
+ | |||
void data() | void data() | ||
{ | { | ||
Line 191: | Line 192: | ||
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: | ||
Line 204: | Line 205: | ||
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"] | ||
Line 216: | Line 217: | ||
[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 | ||
Line 236: | Line 237: | ||
CALL 0xc7:0 | CALL 0xc7:0 | ||
JMP .mainloop | JMP .mainloop | ||
+ | |||
setdec3: | setdec3: | ||
PUSH EDX | PUSH EDX | ||
Line 261: | Line 262: | ||
POP EDX | POP EDX | ||
RET | RET | ||
+ | |||
[SECTION .data] | [SECTION .data] | ||
ALIGNB 4 | ALIGNB 4 | ||
Line 279: | Line 280: | ||
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: | ||
Line 289: | Line 290: | ||
textbox: | textbox: | ||
RESB 64 + 3 * 1 * 8; テキストボックス構造体(3x1文字分) | RESB 64 + 3 * 1 * 8; テキストボックス構造体(3x1文字分) | ||
+ | |||
- | + | *** 説明 [#m286c5df] | |
- | *** 説明 | + | |
-概要: | -概要: | ||
--このプログラムは、ウィンドウを一つ開き、そのウィンドウに1秒おきに数字を表示していくだけのプログラムです。 | --このプログラムは、ウィンドウを一つ開き、そのウィンドウに1秒おきに数字を表示していくだけのプログラムです。 | ||
Line 305: | Line 306: | ||
---この時間間隔指定ですが、少なくとも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 |
(This host) = http://osask.net