ページへ戻る
印刷
introx/mt_xor1.c
をテンプレートにして作成 ::
OSASK計画
osaskwiki
:introx/mt_xor1.c をテンプレートにして作成
開始行:
[[introx]]
"mt_xor1.c"の解説
...
...
このドキュメントは、"mt_xor1.c"の説明だけをするもので...
メントではありません。最初に読むべきドキュメントは"docum...
.c"との違いは32ビットグラフィックボックスを使うことです。
1.アルゴリズム
今まで説明してきた描画方法は点を打つとか線を引くという...
のプログラムでは、もっと込み入ったことがやりたいというの...
の場合、あたかもビデオメモリにアクセスするように自由に読...
と便利でしょう。・・・ここでは、そういうアクセス方法を説...
このアクセス方法は2つの手順で構成されます。まず、指定...
読み書きします。このバッファはグラフィックボックスに対応...
ットになっています(パックドピクセル)。そして一通りのアク...
部分をflushします。flushというのは、メモリ内のバッファの...
させる方法だと理解してください。この操作をしなくてもOS側...
が画面に反映されることはありますが、それは保証されていな...
できません。いじったら必ずflushしてください(リードアクセ...
flushしなくてもよい)。
グラフィックボックスのバッファ構造は、(int *) gbox + 1...
ze * 4がそっくりそのままバッファになっています。単純明快...
スをご覧ください。
このプログラムはその方法でたくさんの点を描画して、ちょ...
す。
2.ライブラリ関数の説明
引数の型については、guigui00.hを参照してください。
lib_flushgraphbox(opt, win, x, y, sx, sy, skip, p) :
グラフィックボックスをflushします。optは0x8024にしてく...
クボックスが所属するウィンドウです。残りのパラメーターが...
ずグラフィックボックス全体をflushするなら、
x, y : グラフィックボックスオープン時に指定したx_p...
sx, sy : グラフィックボックスオープン時に指定したx_s...
skip : 必ず0
p : (int *) gbox + 16
という風に指定します。しかしいじった範囲がグラフィックボ...
という場合もよくあるでしょう。そんなときこのような全範囲...
おいてかなりの無駄になります。そんな時は部分flushを使い...
x, y : 部分flushしたい範囲の左上の座標(window内の...
座標ではない)
sx, sy : 部分flushしたい範囲のサイズ
skip : (グラフィックボックスオープン時に指定したx_...
p : x, yで指定した座標に相当するドットを指し示...
これをよくご覧になれば分かるように、結局は全範囲flushも...
す。
もしたとえば画面内でキャラクターが走っているとすれば、...
スして、元いた場所を背景に戻して移動先にキャラクターを書...
flushすることになります。この場合、移動距離がある程度あ...
です。つまり移動元の部分と移動先の部分です。移動元と移動...
lushを1回やることでももちろん代用できますが、flushはOSに...
。できるだけ狭い範囲に分解してやりましょう。・・・この時...
がいいかと迷われるかもしれません。
1.移動元書き換え → 移動元flush → 移動先書き換え → ...
2.移動元書き換え → 移動先書き換え → 移動元flush → ...
もちろんどちらの手順でも問題なく実行できますが、どちらか...
すめです。というのは、結局画面に反映されるのはflushの時...
キャラクターが画面上から消えている時間が短くて済むせいで...
ターが介在しているのなら、まずはバッファ内の書き換えを集...
集中的にやる方が良いでしょう。
3.改造への指針
このバッファへのアクセスとflushを使えば、かなり自由に...
はずです。しかしflushの際にはVRAMへアクセスすることにな...
です。広い範囲を細かい時間間隔でflushするのは今のところ...
。そういう見栄えのするゲームは、OSASKがグラフィックアク...
るようになるまではちょっと無理かもしれません。・・・それ...
マシンなら、なんとかゲームにはなるかもしれません。
// "mt_xor1.c"
// stack:4k malloc:6k
// copyright(C) 2004 ベイサイド
#include <guigui00.h>
#define AUTO_MALLOC 0
/* ちょっとしたマクロ */
#define pixel(x, y) *(p + (y) * 100 + (x))
/* 基本的なアルゴリズム */
/* 1.グラフィックボックスをオープンする */
/* 2.(int *) graphicbox + 16以降のバイトは、x_size * y_s...
そこを好きなようにいじる(リードしてもライトしてもいい)...
/* 3.いじり終ったら、バッファをflushしなければいけない。...
void OsaskMain()
{
struct LIB_WINDOW *window;
struct LIB_TEXTBOX *wintitle;
struct LIB_GRAPHBOX *graphicbox;
int i, j;
int *p;
lib_init(AUTO_MALLOC);
window = lib_openwindow(AUTO_MALLOC, 0x0200, 136, 48);
wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0, 7,...
lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "Mt....
/* グラフィックボックスをウィンドウに用意する */
graphicbox = lib_opengraphbox(1, AUTO_MALLOC, 4, 8, 10...
/* パラメーターの意味は以下の通り:
opt : 1(固定)
mode : 4(固定)
mode_opt : 初期の背景色(バッファはこのバイトで初期化...
x_size : グラフィックボックスの大きさ(ドット単位)
y_size : グラフィックボックスの大きさ(ドット単位)
x_pos : グラフィックボックスの位置(ドット単位)
y_pos : グラフィックボックスの位置(ドット単位)
*/
p = (int *) graphicbox + 16;
/* 頂点に一つ点を打つ */
pixel(49, 0) = 0; /* 黒い点 */
/* ちょっとした演算 */
for (j = 0; j < 47; j++) {
for (i = 1; i < 99; i++)
pixel(i, j + 1) = ((pixel(i - 1, j) == 0) ^ (pixel...
}
j = 0;
for (;;) {
/* バッファの内容を確実に画面に反映させる */
lib_flushgraphbox(0x8024, window, 18, 0, 100, 48, 0,...
/* パラメーターの意味は以下の通り:
opt : 0x8001(固定)
win : グラフィックボックスが所属するウィンドウ
x : グラフィックボックスのx_pos
y : グラフィックボックスのy_pos
sx : グラフィックボックスのx_size
sy : グラフィックボックスのy_size
skip : 0(固定)
p : (int *) graphbox + 16
なお、上記の例はグラフィックボックス全体をflushし...
*/
lib_waitsignaltime(0x0007, 0, 0, 0x80000000, 0, 0); ...
/* 色変更 */
j = (j + 1) & 0x868686;
for (i = 0; i < 48 * 100; i++) {
if (p[i] != 0xC6C6C6)
p[i] = j;
}
}
}
*** [[K]]の落書き
-こんなのをそのうち<guigui00.h>に追加しようと思います。
#if (!defined(LIB_GBOX_BUF))
#define LIB_GBOX_BUF(gbox) ((void *) ((char *) (gb...
#define LIB_GBOX_BUF8(gbox) ((unsigned char *) LIB_...
#define LIB_GBOX_BUF16(gbox) ((unsigned short *) LIB...
#define LIB_GBOX_BUF32(gbox) ((unsigned int *) LIB_...
#endif
-たぶん僕の言う「そのうち」はなかなかこないので、上記をコ...
*** 修正した説明(案)
-説明がt_xor0と重複しすぎていて、読み手が飛ばし読みをする...
"mt_xor1.c"の解説
...
川合秀...
このドキュメントは、"mt_xor1.c"の説明だけをするもので...
メントではありません。最初に読むべきドキュメントは"docum...
1.アルゴリズム
このmt_xor1は、mt_xor0の改造版に相当します。違いは8ビ...
ではなく32ビットグラフィックボックスを使うことです。mt_x...
ください。
グラフィックボックスのバッファ構造は、LIB_GBOX_BUF32(g...
ysize * 4がそっくりそのままバッファになっています。詳し...
ださい。1ドットが4バイトで構成され、
bit 0- 7:青成分(0-255)
bit 8-15:緑成分(0-255)
bit16-23:赤成分(0-255)
bit24-31:リザーブで必ず0
となっています。8bitグラフィックボックスと同様に、自由に...
じてflushしてください。
2.ライブラリ関数の説明
引数の型については、guigui00.hを参照してください。
lib_flushgraphbox(opt, win, x, y, sx, sy, skip, p) :
グラフィックボックスをflushします。optは0x8004か0x8024...
グラフィックボックスが所属するウィンドウです。残りのパラ...
いです。まずグラフィックボックス全体をflushするなら、
x, y : グラフィックボックスオープン時に指定したx_p...
sx, sy : グラフィックボックスオープン時に指定したx_s...
skip : 必ず0
p : LIB_GBOX_BUF32(gox)
という風に指定します。
32ビットグラフィックボックスで部分フラッシュをするこ...
次のように引数を指定します。
x, y : 部分flushしたい範囲の左上の座標(window内の...
座標ではない)
sx, sy : 部分flushしたい範囲のサイズ
skip : (グラフィックボックスオープン時に指定したx_...
p : x, yで指定した座標に相当するドットを指し示...
optの違いについてですが、通常は0x8004を使います。色表...
から、速度を速くしてほしいという場合に限って(もしくはす...
線がタイリングで点線に化けたりするのが不都合な場合)、0x...
3.改造への指針
これをつかえば8ビットグラフィックボックスでは得られな...
るでしょう。今のところ(完成度が低いせいで)32ビットグラ...
インを引くなどができませんが、それでもバッファに書いてfl...
でもかけます。ラインなどの基本描画機能のサポートはもうし...
-[[K]]の視点で改良したソース。
// "mt_xor1.c"
// stack:4k malloc:20k
// copyright(C) 2004 Hidemi KAWAI
#include <guigui00.h>
#define AUTO_MALLOC 0
/* ちょっとしたマクロ */
#define pixel(x, y) *(p + (y) * 100 + (x))
#if (!defined(LIB_GBOX_BUF))
#define LIB_GBOX_BUF(gbox) ((void *) ((char *) (gb...
#define LIB_GBOX_BUF32(gbox) ((unsigned int *) LIB_...
#endif
void OsaskMain()
{
struct LIB_WINDOW *window;
struct LIB_TEXTBOX *wintitle;
struct LIB_GRAPHBOX *graphicbox;
int i, j;
int *p;
static colortable[8] = {
0x000000, 0x840000, 0x008400, 0x848400, 0x000084...
};
lib_init(AUTO_MALLOC);
window = lib_openwindow(AUTO_MALLOC, 0x0200, 136, 48);
wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0, ...
lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "M...
/* グラフィックボックスをウィンドウに用意する */
graphicbox = lib_opengraphbox(1, AUTO_MALLOC, 4, 0xc...
/* パラメーターの意味は以下の通り:
opt : 1(固定)
mode : 4(固定)
mode_opt : 初期の背景色(バッファはこの値で初期化...
x_size : グラフィックボックスの大きさ(ドット単...
y_size : グラフィックボックスの大きさ(ドット単...
x_pos : グラフィックボックスの位置(ドット単位)
y_pos : グラフィックボックスの位置(ドット単位)
*/
p = LIB_GBOX_BUF32(graphicbox);
/* 頂点に一つ点を打つ */
pixel(49, 0) = 0x000000; /* 黒い点 */
/* ちょっとした演算 */
for (j = 0; j < 47; j++) {
for (i = 1; i < 99; i++)
pixel(i, j + 1) = pixel(i - 1, j) ^ pixel(i ...
}
j = 0;
for (;;) {
/* バッファの内容を確実に画面に反映させる */
lib_flushgraphbox(0x8004, window, 18, 0, 100, 48...
/* パラメーターの意味は以下の通り:
opt : 0x8004 or 0x8024(固定)
win : グラフィックボックスが所属するウィン...
x : グラフィックボックスのx_pos
y : グラフィックボックスのy_pos
sx : グラフィックボックスのx_size
sy : グラフィックボックスのy_size
skip : 0(固定)
p : LIB_GBOX_BUF32(graphbox)
なお、上記の例はグラフィックボックス全体をflu...
*/
lib_waitsignaltime(0x0007, 0, 0, 0x80000000, 0, ...
/* 色変更 */
j = (j + 1) & 7;
for (i = 0; i < 48 * 100; i++) {
if (p[i] != 0xc6c6c6)
p[i] = colortable[j];
}
}
}
終了行:
[[introx]]
"mt_xor1.c"の解説
...
...
このドキュメントは、"mt_xor1.c"の説明だけをするもので...
メントではありません。最初に読むべきドキュメントは"docum...
.c"との違いは32ビットグラフィックボックスを使うことです。
1.アルゴリズム
今まで説明してきた描画方法は点を打つとか線を引くという...
のプログラムでは、もっと込み入ったことがやりたいというの...
の場合、あたかもビデオメモリにアクセスするように自由に読...
と便利でしょう。・・・ここでは、そういうアクセス方法を説...
このアクセス方法は2つの手順で構成されます。まず、指定...
読み書きします。このバッファはグラフィックボックスに対応...
ットになっています(パックドピクセル)。そして一通りのアク...
部分をflushします。flushというのは、メモリ内のバッファの...
させる方法だと理解してください。この操作をしなくてもOS側...
が画面に反映されることはありますが、それは保証されていな...
できません。いじったら必ずflushしてください(リードアクセ...
flushしなくてもよい)。
グラフィックボックスのバッファ構造は、(int *) gbox + 1...
ze * 4がそっくりそのままバッファになっています。単純明快...
スをご覧ください。
このプログラムはその方法でたくさんの点を描画して、ちょ...
す。
2.ライブラリ関数の説明
引数の型については、guigui00.hを参照してください。
lib_flushgraphbox(opt, win, x, y, sx, sy, skip, p) :
グラフィックボックスをflushします。optは0x8024にしてく...
クボックスが所属するウィンドウです。残りのパラメーターが...
ずグラフィックボックス全体をflushするなら、
x, y : グラフィックボックスオープン時に指定したx_p...
sx, sy : グラフィックボックスオープン時に指定したx_s...
skip : 必ず0
p : (int *) gbox + 16
という風に指定します。しかしいじった範囲がグラフィックボ...
という場合もよくあるでしょう。そんなときこのような全範囲...
おいてかなりの無駄になります。そんな時は部分flushを使い...
x, y : 部分flushしたい範囲の左上の座標(window内の...
座標ではない)
sx, sy : 部分flushしたい範囲のサイズ
skip : (グラフィックボックスオープン時に指定したx_...
p : x, yで指定した座標に相当するドットを指し示...
これをよくご覧になれば分かるように、結局は全範囲flushも...
す。
もしたとえば画面内でキャラクターが走っているとすれば、...
スして、元いた場所を背景に戻して移動先にキャラクターを書...
flushすることになります。この場合、移動距離がある程度あ...
です。つまり移動元の部分と移動先の部分です。移動元と移動...
lushを1回やることでももちろん代用できますが、flushはOSに...
。できるだけ狭い範囲に分解してやりましょう。・・・この時...
がいいかと迷われるかもしれません。
1.移動元書き換え → 移動元flush → 移動先書き換え → ...
2.移動元書き換え → 移動先書き換え → 移動元flush → ...
もちろんどちらの手順でも問題なく実行できますが、どちらか...
すめです。というのは、結局画面に反映されるのはflushの時...
キャラクターが画面上から消えている時間が短くて済むせいで...
ターが介在しているのなら、まずはバッファ内の書き換えを集...
集中的にやる方が良いでしょう。
3.改造への指針
このバッファへのアクセスとflushを使えば、かなり自由に...
はずです。しかしflushの際にはVRAMへアクセスすることにな...
です。広い範囲を細かい時間間隔でflushするのは今のところ...
。そういう見栄えのするゲームは、OSASKがグラフィックアク...
るようになるまではちょっと無理かもしれません。・・・それ...
マシンなら、なんとかゲームにはなるかもしれません。
// "mt_xor1.c"
// stack:4k malloc:6k
// copyright(C) 2004 ベイサイド
#include <guigui00.h>
#define AUTO_MALLOC 0
/* ちょっとしたマクロ */
#define pixel(x, y) *(p + (y) * 100 + (x))
/* 基本的なアルゴリズム */
/* 1.グラフィックボックスをオープンする */
/* 2.(int *) graphicbox + 16以降のバイトは、x_size * y_s...
そこを好きなようにいじる(リードしてもライトしてもいい)...
/* 3.いじり終ったら、バッファをflushしなければいけない。...
void OsaskMain()
{
struct LIB_WINDOW *window;
struct LIB_TEXTBOX *wintitle;
struct LIB_GRAPHBOX *graphicbox;
int i, j;
int *p;
lib_init(AUTO_MALLOC);
window = lib_openwindow(AUTO_MALLOC, 0x0200, 136, 48);
wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0, 7,...
lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "Mt....
/* グラフィックボックスをウィンドウに用意する */
graphicbox = lib_opengraphbox(1, AUTO_MALLOC, 4, 8, 10...
/* パラメーターの意味は以下の通り:
opt : 1(固定)
mode : 4(固定)
mode_opt : 初期の背景色(バッファはこのバイトで初期化...
x_size : グラフィックボックスの大きさ(ドット単位)
y_size : グラフィックボックスの大きさ(ドット単位)
x_pos : グラフィックボックスの位置(ドット単位)
y_pos : グラフィックボックスの位置(ドット単位)
*/
p = (int *) graphicbox + 16;
/* 頂点に一つ点を打つ */
pixel(49, 0) = 0; /* 黒い点 */
/* ちょっとした演算 */
for (j = 0; j < 47; j++) {
for (i = 1; i < 99; i++)
pixel(i, j + 1) = ((pixel(i - 1, j) == 0) ^ (pixel...
}
j = 0;
for (;;) {
/* バッファの内容を確実に画面に反映させる */
lib_flushgraphbox(0x8024, window, 18, 0, 100, 48, 0,...
/* パラメーターの意味は以下の通り:
opt : 0x8001(固定)
win : グラフィックボックスが所属するウィンドウ
x : グラフィックボックスのx_pos
y : グラフィックボックスのy_pos
sx : グラフィックボックスのx_size
sy : グラフィックボックスのy_size
skip : 0(固定)
p : (int *) graphbox + 16
なお、上記の例はグラフィックボックス全体をflushし...
*/
lib_waitsignaltime(0x0007, 0, 0, 0x80000000, 0, 0); ...
/* 色変更 */
j = (j + 1) & 0x868686;
for (i = 0; i < 48 * 100; i++) {
if (p[i] != 0xC6C6C6)
p[i] = j;
}
}
}
*** [[K]]の落書き
-こんなのをそのうち<guigui00.h>に追加しようと思います。
#if (!defined(LIB_GBOX_BUF))
#define LIB_GBOX_BUF(gbox) ((void *) ((char *) (gb...
#define LIB_GBOX_BUF8(gbox) ((unsigned char *) LIB_...
#define LIB_GBOX_BUF16(gbox) ((unsigned short *) LIB...
#define LIB_GBOX_BUF32(gbox) ((unsigned int *) LIB_...
#endif
-たぶん僕の言う「そのうち」はなかなかこないので、上記をコ...
*** 修正した説明(案)
-説明がt_xor0と重複しすぎていて、読み手が飛ばし読みをする...
"mt_xor1.c"の解説
...
川合秀...
このドキュメントは、"mt_xor1.c"の説明だけをするもので...
メントではありません。最初に読むべきドキュメントは"docum...
1.アルゴリズム
このmt_xor1は、mt_xor0の改造版に相当します。違いは8ビ...
ではなく32ビットグラフィックボックスを使うことです。mt_x...
ください。
グラフィックボックスのバッファ構造は、LIB_GBOX_BUF32(g...
ysize * 4がそっくりそのままバッファになっています。詳し...
ださい。1ドットが4バイトで構成され、
bit 0- 7:青成分(0-255)
bit 8-15:緑成分(0-255)
bit16-23:赤成分(0-255)
bit24-31:リザーブで必ず0
となっています。8bitグラフィックボックスと同様に、自由に...
じてflushしてください。
2.ライブラリ関数の説明
引数の型については、guigui00.hを参照してください。
lib_flushgraphbox(opt, win, x, y, sx, sy, skip, p) :
グラフィックボックスをflushします。optは0x8004か0x8024...
グラフィックボックスが所属するウィンドウです。残りのパラ...
いです。まずグラフィックボックス全体をflushするなら、
x, y : グラフィックボックスオープン時に指定したx_p...
sx, sy : グラフィックボックスオープン時に指定したx_s...
skip : 必ず0
p : LIB_GBOX_BUF32(gox)
という風に指定します。
32ビットグラフィックボックスで部分フラッシュをするこ...
次のように引数を指定します。
x, y : 部分flushしたい範囲の左上の座標(window内の...
座標ではない)
sx, sy : 部分flushしたい範囲のサイズ
skip : (グラフィックボックスオープン時に指定したx_...
p : x, yで指定した座標に相当するドットを指し示...
optの違いについてですが、通常は0x8004を使います。色表...
から、速度を速くしてほしいという場合に限って(もしくはす...
線がタイリングで点線に化けたりするのが不都合な場合)、0x...
3.改造への指針
これをつかえば8ビットグラフィックボックスでは得られな...
るでしょう。今のところ(完成度が低いせいで)32ビットグラ...
インを引くなどができませんが、それでもバッファに書いてfl...
でもかけます。ラインなどの基本描画機能のサポートはもうし...
-[[K]]の視点で改良したソース。
// "mt_xor1.c"
// stack:4k malloc:20k
// copyright(C) 2004 Hidemi KAWAI
#include <guigui00.h>
#define AUTO_MALLOC 0
/* ちょっとしたマクロ */
#define pixel(x, y) *(p + (y) * 100 + (x))
#if (!defined(LIB_GBOX_BUF))
#define LIB_GBOX_BUF(gbox) ((void *) ((char *) (gb...
#define LIB_GBOX_BUF32(gbox) ((unsigned int *) LIB_...
#endif
void OsaskMain()
{
struct LIB_WINDOW *window;
struct LIB_TEXTBOX *wintitle;
struct LIB_GRAPHBOX *graphicbox;
int i, j;
int *p;
static colortable[8] = {
0x000000, 0x840000, 0x008400, 0x848400, 0x000084...
};
lib_init(AUTO_MALLOC);
window = lib_openwindow(AUTO_MALLOC, 0x0200, 136, 48);
wintitle = lib_opentextbox(0x1000, AUTO_MALLOC, 0, ...
lib_putstring_ASCII(0x0000, 0, 0, wintitle, 0, 0, "M...
/* グラフィックボックスをウィンドウに用意する */
graphicbox = lib_opengraphbox(1, AUTO_MALLOC, 4, 0xc...
/* パラメーターの意味は以下の通り:
opt : 1(固定)
mode : 4(固定)
mode_opt : 初期の背景色(バッファはこの値で初期化...
x_size : グラフィックボックスの大きさ(ドット単...
y_size : グラフィックボックスの大きさ(ドット単...
x_pos : グラフィックボックスの位置(ドット単位)
y_pos : グラフィックボックスの位置(ドット単位)
*/
p = LIB_GBOX_BUF32(graphicbox);
/* 頂点に一つ点を打つ */
pixel(49, 0) = 0x000000; /* 黒い点 */
/* ちょっとした演算 */
for (j = 0; j < 47; j++) {
for (i = 1; i < 99; i++)
pixel(i, j + 1) = pixel(i - 1, j) ^ pixel(i ...
}
j = 0;
for (;;) {
/* バッファの内容を確実に画面に反映させる */
lib_flushgraphbox(0x8004, window, 18, 0, 100, 48...
/* パラメーターの意味は以下の通り:
opt : 0x8004 or 0x8024(固定)
win : グラフィックボックスが所属するウィン...
x : グラフィックボックスのx_pos
y : グラフィックボックスのy_pos
sx : グラフィックボックスのx_size
sy : グラフィックボックスのy_size
skip : 0(固定)
p : LIB_GBOX_BUF32(graphbox)
なお、上記の例はグラフィックボックス全体をflu...
*/
lib_waitsignaltime(0x0007, 0, 0, 0x80000000, 0, ...
/* 色変更 */
j = (j + 1) & 7;
for (i = 0; i < 48 * 100; i++) {
if (p[i] != 0xc6c6c6)
p[i] = colortable[j];
}
}
}
ページ名: