3: 2004-12-14 (火) 13:39:06 [6] | 現: 2024-01-08 (月) 12:58:56 k-tan[7] [8] | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | * 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() | ||
{ | { | ||
Line 23: | Line 25: | ||
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); | ||
Line 32: | Line 34: | ||
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) { | ||
Line 40: | Line 42: | ||
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までしか扱えない */ | ||
Line 54: | Line 56: | ||
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; | ||
Line 84: | Line 87: | ||
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() | ||
{ | { | ||
Line 105: | Line 108: | ||
return; | return; | ||
} | } | ||
+ | |||
asmout("[SECTION .data]"); | asmout("[SECTION .data]"); | ||
+ | |||
void data() | void data() | ||
{ | { | ||
Line 124: | Line 127: | ||
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 137: | Line 140: | ||
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"] | ||
Line 149: | Line 153: | ||
[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 | ||
Line 176: | Line 180: | ||
MOV EBX,sleep | MOV EBX,sleep | ||
CALL 0xc7:0 | CALL 0xc7:0 | ||
+ | |||
setdec2: | setdec2: | ||
PUSH ECX | PUSH ECX | ||
Line 193: | Line 197: | ||
POP ECX | POP ECX | ||
RET | RET | ||
+ | |||
; .で始まるラベルはローカルラベル。 | ; .で始まるラベルはローカルラベル。 | ||
; ローカルラベルは、次のグローバルラベル宣言までが有効範囲。 | ; ローカルラベルは、次のグローバルラベル宣言までが有効範囲。 | ||
+ | |||
[SECTION .data] | [SECTION .data] | ||
ALIGNB 4 | ALIGNB 4 | ||
Line 212: | Line 216: | ||
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 222: | Line 226: | ||
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の文法の違いが出てきますので、見比べてみるのも面白いかもしれません。どれでもいいのですので、好きな言語を活用してください。 | ||
Line 241: | Line 244: | ||
---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]] | ||
~ | ~ | ||
~ | ~ | ||
Line 257: | Line 261: | ||
--そんなわけで、僕としてはこの手法に沿った人からの質問にはできるだけ答えますが、そうでない人は自己努力不足ということで、十分な回答をしない場合があります。ご了承ください(これは具体的にどういうことかというと、問題あるソースだけではなく、問題なく動いていた段階のソースの提示を求めることがある、ということです)。 | --そんなわけで、僕としてはこの手法に沿った人からの質問にはできるだけ答えますが、そうでない人は自己努力不足ということで、十分な回答をしない場合があります。ご了承ください(これは具体的にどういうことかというと、問題あるソースだけではなく、問題なく動いていた段階のソースの提示を求めることがある、ということです)。 | ||
- | * こめんと欄 | + | * こめんと欄 [#s8db1e95] |
- | #comment | + | -tolset08にあわせて修正。 -- [[K]] SIZE(10){2005-01-29 (土) 15:34:36} |
+ | |||
+ | //#comment |
(This host) = http://osask.net