ページへ戻る
印刷
guide/wintro0001
をテンプレートにして作成 ::
OSASK計画
osaskwiki
:guide/wintro0001 をテンプレートにして作成
開始行:
TITLE:x
* wiki版のintroシリーズ no.0001
-(by [[K]], 2004.12.13)
-これはC言語でもASKAでもnaskでもとにかくごちゃまぜでintro...
--これは[[guide/wintro0000]]の続きなので、それを読んでな...
---最初から読みたい人は[[guide/C]]や[[guide/ASKA]]や[[gui...
--C言語をやる人はintroaを読むといいでしょう。ここのプログ...
-質問とか感想とかはこめんと欄にレッツゴー。
*** color
-C版:"colorc1.c" [tolset08では 546バイト]
//-C版:"colorc1.c" [osa_dir2では 615バイト]
/* "colorc1.c":colorをC言語で記述した例 */
/* stack:4k malloc:2k */
#include <guigui00.h>
#define AUTO_MALLOC 0
void setdec2(const int i, char *s);
void OsaskMain()
{
struct LIB_WINDOW *window;
struct LIB_TEXTBOX *wintitle, *textbox;
int i;
static char msg[] = "color 0";
/* ライブラリ初期化 */
lib_init(AUTO_MALLOC);
/* ウィンドウのオープン */
window = lib_openwindow(AUTO_MALLOC, 0x0200, 20 * 8,...
wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0, ...
textbox = lib_opentextbox(0x0001, AUTO_MALLOC, 0, 2...
lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "c...
/* メインルーチン */
for (i = 0; i < 16; i += 2) {
setdec2(i, &msg[6]);
lib_putstring_ASCII(0x0000, 0, i / 2, textbox, ...
setdec2(i + 1, &msg[6]);
lib_putstring_ASCII(0x0000, 10, i / 2, textbox, ...
}
/* 終了 */
lib_waitsignal(0x0001, 0, 0);
}
void setdec2(const int i, char *s)
/* 注意:このルーチンでは、0~99までしか扱えない */
{
s[0] = '0' + i / 10;
s[1] = '0' + i % 10;
if (s[0] == '0')
s[0] = ' ';
return;
}
-ASKA版:"colora1.ask" [tolset08では 210バイト]
//-ASKA版:"colora1.ask" [osa_dir2では 239バイト]
/* "colora1.ask":colorをASKAで記述した例 */
/* stack:4k malloc:0k */
segment CODE(USE32, PARA); default(code == CODE); asmout...
asmout("GLOBAL _OsaskMain");
void setdec2(); /* ALをDS:ESIに書き込む */
void _OsaskMain()
{
asmout("MOV EBX,data.init"); CALL(0xc7, 0);
unsigned char i == AL, x == CL, y == CH;
i = 0;
do {
asmout("MOV EBX,data.putstr");
x = 10;
y = i;
y /= 2;
if (CF == 0)
x = 0; /* yが割り切れたらxは0に */
[EBX + 8] = x;
[EBX + 12] = y;
[EBX + 20] = i;
LEA(ESI, [EBX + 42]);
setdec2();
CALL(0xc7, 0);
i++;
} while (i < 16);
asmout("MOV EBX,data.sleep"); CALL(0xc7, 0);
}
void setdec2()
{
char *s == DS:ESI;
PUSH(ECX);
PUSH(EAX);
CL = 10;
AH = 0;
DIV(CL); /* AX / CL = AL ... AH */
EAX |= 0x3030; /* '00' */
if (AL == 0x30)
AL = 0x20; /* ' ' */
s[0] = AL;
s[1] = AH;
POP(EAX);
POP(ECX);
return;
}
asmout("[SECTION .data]");
void data()
{
ALIGNB(4);
init:
asmout("DD 0x0004, data.work"); /* lib_init */
asmout("DD 0x0020, data.window, 0x0200, 20 * 8, 8 * ...
asmout("DD 0x0028, 0x1000, data.wintitle, 0, 7, 1, 0...
asmout("DD 0x0028, 0x0001, data.textbox, 0, 20, 8, 0...
asmout("DD 0x0040, 0x1000, 0, 0, data.wintitle, 0, 0...
DD(0x0000); /* end of functions */
putstr:
asmout("DD 0x0040, 0x1000, 0, 0, data.textbox, 0, 0...
DD(0x0000); /* end of functions */
sleep:
DD(0x0018, 0x0001, 0, 0); /* lib_waitsignal */
DD(0x0000); /* end of functions */
ALIGNB(8);
work:
RESB(256); /* func_initに必要な256バイトのワークエリ...
window:
RESB(128); /* ウィンドウ構造体 */
wintitle:
RESB(64); /* テキストボックス構造体 */
RESB(56); /* 7x1文字分 (7 * 1 * 8) */
textbox:
RESB(64); /* テキストボックス構造体 */
RESB(1280); /* 20x8文字分 (20 * 8 * 8) */
}
-nask版:"colorn1.nas" [tolset08では 209バイト]
//-nask版:"colorn1.nas" [osa_dir2では 237バイト]
; "colorn1.nas":colorをnaskで記述した例
; stack:4k malloc:0k
[FORMAT "WCOFF"]
[INSTRSET "i486p"]
[OPTIMIZE 1]
[OPTION 1]
[BITS 32]
[FILE "colorn1.nas"]
[SECTION .text]
GLOBAL _OsaskMain
_OsaskMain:
MOV EBX,init
CALL 0xc7:0
MOV AL,0
.mainloop:
MOV EBX,putstr
MOV CL,10
MOV CH,AL
SHR CH,1
JC .skip
MOV CL,0
.skip:
MOV [EBX+ 8],CL
MOV [EBX+12],CH
MOV [EBX+20],AL
LEA ESI,[EBX+42]
CALL setdec2
CALL 0xc7:0
INC AL
CMP AL,16
JB .mainloop
MOV EBX,sleep
CALL 0xc7:0
setdec2:
PUSH ECX
PUSH EAX
MOV CL,10
MOV AH,0
DIV CL
OR EAX,'00'
CMP AL,'0'
JNE .skip
MOV AL,' '
.skip:
MOV [ESI+0],AL
MOV [ESI+1],AH
POP EAX
POP ECX
RET
; .で始まるラベルはローカルラベル。
; ローカルラベルは、次のグローバルラベル宣言までが有効範...
[SECTION .data]
ALIGNB 4
init:
DD 0x0004, work ; lib_init
DD 0x0020, window, 0x0200, 20 * 8, 8 * 16 ; lib_open...
DD 0x0028, 0x1000, wintitle, 0, 7, 1, 0, 0, window, ...
DD 0x0028, 0x0001, textbox, 0, 20, 8, 0, 0, window, ...
DD 0x0040, 0x1000, 0, 0, wintitle, 0, 0, 0, 7, 'col...
DD 0x0000 ; end of functions
putstr:
DD 0x0040, 0x1000, 0, 0, textbox, 0, 0, 0, 8, 'colo...
DD 0x0000 ; end of functions
sleep:
DD 0x0018, 0x0001, 0, 0 ; lib_waitsignal
DD 0x0000 ; end of functions
ALIGNB 8
work:
RESB 256 ; func_initに必要な256バイトのワークエリア
window:
RESB 128 ; ウィンドウ構造体
wintitle:
RESB 64 + 7 * 1 * 8; テキストボックス構造体(7x1文...
textbox:
RESB 64 + 20 * 8 * 8; テキストボックス構造体(20x8...
*** 説明
-概要:
--このプログラムは、ウィンドウを一つ開き、そのウィンドウ...
--このプログラムを通じて、テキストに色を付ける方法と、数...
--OSASKでは、printf()やitoa()などの便利な関数がまだ用意さ...
--これくらいの規模の例になると、CとASKAとnaskの文法の違い...
-APIの説明:
--lib_opentextbox(opt, textbox, backcolor, x_size, y_size...
---ウィンドウにテキストボックスを貼ります。optの値は、0と...
--lib_putstring_ASCII(opt, x_pos, y_pos, textbox, color, ...
---colorc1.cでは使われていませんが、optに1を指定すること...
---ASKA/naskのlib_putstring1も全く同様で、optの最下位ビッ...
*** まとめ
-これで、テキストボックスを使った表示は一通りできるように...
-なお、C版でテキストボックスを広げる際には、malloc領域が...
*** おまけ
-次回(no.0002)は時間制御関係を少しやります。これで、変...
-続編はこちら → [[guide/wintro0002]]
~
~
-''実際の開発をするにあたって''
--このwintroシリーズを読んでいる人は、introシリーズを読ん...
--初心者がよくやることの一つに、プログラムをゼロから作り...
--うまい方法は、まず、適当なサンプルアプリを見つけてきて...
--プログラムに経験があると過信している人ほど、この作業を...
--この「こまめに make run 」「おかしくなったらつべこべ言...
--そんなわけで、僕としてはこの手法に沿った人からの質問に...
* こめんと欄
-tolset08にあわせて修正。 -- [[K]] SIZE(10){2005-01-29 (...
//#comment
終了行:
TITLE:x
* wiki版のintroシリーズ no.0001
-(by [[K]], 2004.12.13)
-これはC言語でもASKAでもnaskでもとにかくごちゃまぜでintro...
--これは[[guide/wintro0000]]の続きなので、それを読んでな...
---最初から読みたい人は[[guide/C]]や[[guide/ASKA]]や[[gui...
--C言語をやる人はintroaを読むといいでしょう。ここのプログ...
-質問とか感想とかはこめんと欄にレッツゴー。
*** color
-C版:"colorc1.c" [tolset08では 546バイト]
//-C版:"colorc1.c" [osa_dir2では 615バイト]
/* "colorc1.c":colorをC言語で記述した例 */
/* stack:4k malloc:2k */
#include <guigui00.h>
#define AUTO_MALLOC 0
void setdec2(const int i, char *s);
void OsaskMain()
{
struct LIB_WINDOW *window;
struct LIB_TEXTBOX *wintitle, *textbox;
int i;
static char msg[] = "color 0";
/* ライブラリ初期化 */
lib_init(AUTO_MALLOC);
/* ウィンドウのオープン */
window = lib_openwindow(AUTO_MALLOC, 0x0200, 20 * 8,...
wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0, ...
textbox = lib_opentextbox(0x0001, AUTO_MALLOC, 0, 2...
lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "c...
/* メインルーチン */
for (i = 0; i < 16; i += 2) {
setdec2(i, &msg[6]);
lib_putstring_ASCII(0x0000, 0, i / 2, textbox, ...
setdec2(i + 1, &msg[6]);
lib_putstring_ASCII(0x0000, 10, i / 2, textbox, ...
}
/* 終了 */
lib_waitsignal(0x0001, 0, 0);
}
void setdec2(const int i, char *s)
/* 注意:このルーチンでは、0~99までしか扱えない */
{
s[0] = '0' + i / 10;
s[1] = '0' + i % 10;
if (s[0] == '0')
s[0] = ' ';
return;
}
-ASKA版:"colora1.ask" [tolset08では 210バイト]
//-ASKA版:"colora1.ask" [osa_dir2では 239バイト]
/* "colora1.ask":colorをASKAで記述した例 */
/* stack:4k malloc:0k */
segment CODE(USE32, PARA); default(code == CODE); asmout...
asmout("GLOBAL _OsaskMain");
void setdec2(); /* ALをDS:ESIに書き込む */
void _OsaskMain()
{
asmout("MOV EBX,data.init"); CALL(0xc7, 0);
unsigned char i == AL, x == CL, y == CH;
i = 0;
do {
asmout("MOV EBX,data.putstr");
x = 10;
y = i;
y /= 2;
if (CF == 0)
x = 0; /* yが割り切れたらxは0に */
[EBX + 8] = x;
[EBX + 12] = y;
[EBX + 20] = i;
LEA(ESI, [EBX + 42]);
setdec2();
CALL(0xc7, 0);
i++;
} while (i < 16);
asmout("MOV EBX,data.sleep"); CALL(0xc7, 0);
}
void setdec2()
{
char *s == DS:ESI;
PUSH(ECX);
PUSH(EAX);
CL = 10;
AH = 0;
DIV(CL); /* AX / CL = AL ... AH */
EAX |= 0x3030; /* '00' */
if (AL == 0x30)
AL = 0x20; /* ' ' */
s[0] = AL;
s[1] = AH;
POP(EAX);
POP(ECX);
return;
}
asmout("[SECTION .data]");
void data()
{
ALIGNB(4);
init:
asmout("DD 0x0004, data.work"); /* lib_init */
asmout("DD 0x0020, data.window, 0x0200, 20 * 8, 8 * ...
asmout("DD 0x0028, 0x1000, data.wintitle, 0, 7, 1, 0...
asmout("DD 0x0028, 0x0001, data.textbox, 0, 20, 8, 0...
asmout("DD 0x0040, 0x1000, 0, 0, data.wintitle, 0, 0...
DD(0x0000); /* end of functions */
putstr:
asmout("DD 0x0040, 0x1000, 0, 0, data.textbox, 0, 0...
DD(0x0000); /* end of functions */
sleep:
DD(0x0018, 0x0001, 0, 0); /* lib_waitsignal */
DD(0x0000); /* end of functions */
ALIGNB(8);
work:
RESB(256); /* func_initに必要な256バイトのワークエリ...
window:
RESB(128); /* ウィンドウ構造体 */
wintitle:
RESB(64); /* テキストボックス構造体 */
RESB(56); /* 7x1文字分 (7 * 1 * 8) */
textbox:
RESB(64); /* テキストボックス構造体 */
RESB(1280); /* 20x8文字分 (20 * 8 * 8) */
}
-nask版:"colorn1.nas" [tolset08では 209バイト]
//-nask版:"colorn1.nas" [osa_dir2では 237バイト]
; "colorn1.nas":colorをnaskで記述した例
; stack:4k malloc:0k
[FORMAT "WCOFF"]
[INSTRSET "i486p"]
[OPTIMIZE 1]
[OPTION 1]
[BITS 32]
[FILE "colorn1.nas"]
[SECTION .text]
GLOBAL _OsaskMain
_OsaskMain:
MOV EBX,init
CALL 0xc7:0
MOV AL,0
.mainloop:
MOV EBX,putstr
MOV CL,10
MOV CH,AL
SHR CH,1
JC .skip
MOV CL,0
.skip:
MOV [EBX+ 8],CL
MOV [EBX+12],CH
MOV [EBX+20],AL
LEA ESI,[EBX+42]
CALL setdec2
CALL 0xc7:0
INC AL
CMP AL,16
JB .mainloop
MOV EBX,sleep
CALL 0xc7:0
setdec2:
PUSH ECX
PUSH EAX
MOV CL,10
MOV AH,0
DIV CL
OR EAX,'00'
CMP AL,'0'
JNE .skip
MOV AL,' '
.skip:
MOV [ESI+0],AL
MOV [ESI+1],AH
POP EAX
POP ECX
RET
; .で始まるラベルはローカルラベル。
; ローカルラベルは、次のグローバルラベル宣言までが有効範...
[SECTION .data]
ALIGNB 4
init:
DD 0x0004, work ; lib_init
DD 0x0020, window, 0x0200, 20 * 8, 8 * 16 ; lib_open...
DD 0x0028, 0x1000, wintitle, 0, 7, 1, 0, 0, window, ...
DD 0x0028, 0x0001, textbox, 0, 20, 8, 0, 0, window, ...
DD 0x0040, 0x1000, 0, 0, wintitle, 0, 0, 0, 7, 'col...
DD 0x0000 ; end of functions
putstr:
DD 0x0040, 0x1000, 0, 0, textbox, 0, 0, 0, 8, 'colo...
DD 0x0000 ; end of functions
sleep:
DD 0x0018, 0x0001, 0, 0 ; lib_waitsignal
DD 0x0000 ; end of functions
ALIGNB 8
work:
RESB 256 ; func_initに必要な256バイトのワークエリア
window:
RESB 128 ; ウィンドウ構造体
wintitle:
RESB 64 + 7 * 1 * 8; テキストボックス構造体(7x1文...
textbox:
RESB 64 + 20 * 8 * 8; テキストボックス構造体(20x8...
*** 説明
-概要:
--このプログラムは、ウィンドウを一つ開き、そのウィンドウ...
--このプログラムを通じて、テキストに色を付ける方法と、数...
--OSASKでは、printf()やitoa()などの便利な関数がまだ用意さ...
--これくらいの規模の例になると、CとASKAとnaskの文法の違い...
-APIの説明:
--lib_opentextbox(opt, textbox, backcolor, x_size, y_size...
---ウィンドウにテキストボックスを貼ります。optの値は、0と...
--lib_putstring_ASCII(opt, x_pos, y_pos, textbox, color, ...
---colorc1.cでは使われていませんが、optに1を指定すること...
---ASKA/naskのlib_putstring1も全く同様で、optの最下位ビッ...
*** まとめ
-これで、テキストボックスを使った表示は一通りできるように...
-なお、C版でテキストボックスを広げる際には、malloc領域が...
*** おまけ
-次回(no.0002)は時間制御関係を少しやります。これで、変...
-続編はこちら → [[guide/wintro0002]]
~
~
-''実際の開発をするにあたって''
--このwintroシリーズを読んでいる人は、introシリーズを読ん...
--初心者がよくやることの一つに、プログラムをゼロから作り...
--うまい方法は、まず、適当なサンプルアプリを見つけてきて...
--プログラムに経験があると過信している人ほど、この作業を...
--この「こまめに make run 」「おかしくなったらつべこべ言...
--そんなわけで、僕としてはこの手法に沿った人からの質問に...
* こめんと欄
-tolset08にあわせて修正。 -- [[K]] SIZE(10){2005-01-29 (...
//#comment
ページ名: