a21_tl9a
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 「はりぼて言語」について
-(by [[K]], 2021.02.24)
** (1) はじめに
-私は、「30日でできる!OS自作入門」みたいなノリで、「10日...
-それで、まずは自分でこのテキストでのゴールになりそうな言...
-もしかしたら「プログラミング言語自作入門のテキストの最後...
** (2) 基本情報 & ダウンロード
-言語処理系の名前: ''「TL-9a」''(開発コードネーム)
--名前については、「はりぼて言語」だからHL-9aとかにすれば...
--いやその最初はこんなに面白い言語になるとは思っていなく...
-ソースコード: ''C言語で785行''
--できるだけ機種依存しないように書いているので、多くの環...
--私は教材用のプログラムは一般に行数が少ないことが重要だ...
--もちろん行数を減らすテクニックの中には、可読性を大きく...
-実行ファイルの大きさ(参考): ''Windows用で 10.5KB''
--私はC言語プログラムの規模を行数だけで推し量るのは賢明で...
--しかしそんな小手先のごまかしをしても、実行ファイルの大...
--この10.5KBというサイズは、以下に説明する機能からすれば...
--なおこの10.5KBの中には以下のaclライブラリも静的リンクさ...
--そういう意味では、TL-9a本体だけならもっと小さいというこ...
--きっと多くのCプログラマは、今まで10KB以上のアプリを書い...
-利用ライブラリ: ''aclライブラリ''
--私は自作言語でグラフィックを扱うのが大好きで、この「は...
--もしtl9a.cを自前でコンパイルする場合(Windows以外の環境...
-言語のタイプ: ''スクリプト言語(インタプリタ)、JITコン...
--私は高速な実行が好きで、だからJITコンパイラを作るのが好...
--でもその分、実行速度はそれなりになります。処理内容によ...
--でも5倍で済むのならむしろ非JITコンパイラとしては優秀な...
--なお、「10日くらいでできる!プログラミング言語自作入門...
--さらに、このTL-9aをJITではない普通のコンパイラに改造す...
--(そもそもこのTL-9aは、内部では実行速度を上げるために内...
-基本的な機能説明: ''符号付き整数型・整数演算のみ対応、演...
--以下のプログラム例を見ると、なんだかすごくいろいろでき...
--aMain()という、aclライブラリにおけるmain関数を書いてい...
--なぜそんな仕様になっているのかといえば、「同じアプリケ...
--TL-9aの見た目がどんなにC言語っぽくても、TL-9aはC言語に...
--なお、以下のサンプルはaclライブラリを使えば、普通にgcc...
----
-''ダウンロード'': (tl9a.exeと以下のサンプルコードとtl9a...
--http://k.osask.jp/files/tl9a_demo.zip
--動かし方は、tl9a.exeを起動してから「run grd.c」とするか...
** (3) プログラム例 (TL-9aで実行できるプログラム)
-''grd.c''
--グラデーションを表示します。上記説明にある通り、#includ...
--aOpenWin(), aSetPix0(), aWait()は、TL-9aの組み込み関数...
#include <acl.c>
void aMain()
{
AWindow *w;
int x, y, c;
w = aOpenWin(256, 256, "grd", 1);
c = 0;
for (y = 0; y < 256; y++) {
for (x = 0; x < 256; x++) {
aSetPix0(w, x, y, c);
c = c + 0x100;
}
}
aWait(-1);
}
|http://k.osask.jp/files/esb20190827a.png|
----
-''mandel.c''
--マンデルブロー集合の描画プログラムです。上記説明にある...
--mul64shr()という関数の処理内容が気になると思いますが、...
#include <acl.c>
#include "tl9builtin.c"
void aMain()
{
AWindow *w;
int x, y, sx, sy, cx, cy, zx, zy, xx, yy, t, n, sn, c;
w = aOpenWin(512, 384, "mandel", 1);
for (y = 0; y < 384; y++) {
for (x = 0; x < 512; x++) {
sn = 0;
for (sx = 0; sx < 4; sx++) {
cx = (x * 4 + sx) * 56 + 4673536;
for (sy = 0; sy < 4; sy++) {
cy = (y * 4 + sy) * -56 - 124928;
zx = cx; zy = cy;
for (n = 1; n < 447; n++) {
xx = mul64shr(zx, zx, 24);
yy = mul64shr(zy, zy, 24);
t = xx + yy;
if (t > 0x4000000) break;
zy = mul64shr(zy, zx, 23);
zx = xx + cx - yy;
zy = zy + cy;
}
sn = sn + n;
}
}
n = sn >> 4;
c = aRgb8(n, 0, 0);
if (n > 255) {
c = aRgb8(0, 0, 0);
if (n != 447) {
c = aRgb8(255, n - 255, 0);
}
}
aSetPix0(w, x, y, c);
}
}
printTime();
aWait(-1);
}
|http://k.osask.jp/files/esb20190827b.png|
----
-''maze.c''
--迷路作成(穴掘り法)のプログラムです。上記説明にある通...
--乱数で迷路を作っているので、実行するたびに違う迷路が出...
#include <acl.c>
void aMain()
{
AWindow *w;
int i, x, y, xx, yy, d0, d1, d2, d3, d, dd;
w = aOpenWin(752, 496, "maze", 1);
aFillRect0(w, 752, 496, 0, 0, 0x00ff00);
aFillRect0(w, 16, 16, 16, 16, 0x000000);
for (i = 0; i < 1000000; i++) {
x = ((aXorShift32() & 0x7fffffff) % 23) * 2 + 1;
y = ((aXorShift32() & 0x7fffffff) % 15) * 2 + 1;
if (aGetPix(w, x * 16, y * 16) == 0x000000) {
for (;;) {
d0 = d1 = d2 = d3 = 0;
xx = x * 16;
yy = y * 16;
aFillRect0(w, 16, 16, xx, yy, 0x000000);
if (x != 45) { d0 = (aGetPix(w, xx + 16,...
if (x != 1) { d1 = (aGetPix(w, xx - 16,...
if (y != 29) { d2 = (aGetPix(w, xx, yy +...
if (y != 1) { d3 = (aGetPix(w, xx, yy -...
d = d0 + d1 + d2 + d3;
if (d == 0) break;
dd = (aXorShift32() & 0x7fffffff) % d;
if (d0) { if (dd == 0) { aFillRect0(w, 1...
if (d1) { if (dd == 0) { aFillRect0(w, 1...
if (d2) { if (dd == 0) { aFillRect0(w, 1...
if (d3) { if (dd == 0) { aFillRect0(w, 1...
}
}
}
aWait(-1);
}
|http://essen.osask.jp/download/esb20191120a.png|
----
-''kcube.c''
--[[K]]にとっては定番の、キューブ回転プログラムです。上記...
--mul64shr()やff16sin()などの関数の処理内容が気になると思...
#include <acl.c>
#include "tl9buitin.c"
int vertx[8] ={ 2, 2, 2, 2, 0, 0, 0, 0 };
int verty[8] ={ 2, 2, 0, 0, 2, 2, 0, 0 };
int vertz[8] ={ 2, 0, 2, 0, 2, 0, 2, 0 };
int squar[24] = { 0,4,6,2, 1,3,7,5, 0,2,3,1, 0,1,5,4, 4,...
int col[6] = { 0xff0000, 0x00ff00, 0xffff00, 0x0000ff, 0...
void aMain()
{
int vx[8]; int vy[8]; int vz[8];
int centerz4[6];
int scx[8]; int scy[8];
int buf0[160]; int buf1[160];
int i, j, k, l, thx, thy, thz, xp, xa, yp, ya, zp, z...
int k0, k1, k2, e0x, e0y, e1x, e1y, l1, p0x, p0y, p1...
int dx, *buf, y0, y1;
AWindow *w;
w = aOpenWin(256, 160, "kcube", 1);
for (i = 0; i < 8; i++) {
vertx[i] = (vertx[i] - 1) * 50;
verty[i] = (verty[i] - 1) * 50;
vertz[i] = (vertz[i] - 1) * 50;
}
thx = thy = thz = 0;
for (;;) {
thx = (thx + 182) & 0xffff;
thy = (thy + 273) & 0xffff;
thz = (thz + 364) & 0xffff;
xp = ff16cos(thx); xa = ff16sin(thx);
yp = ff16cos(thy); ya = ff16sin(thy);
zp = ff16cos(thz); za = ff16sin(thz);
for (i = 0; i < 8; i++) {
zt = vertz[i] * xp + verty[i] * xa;
yt = verty[i] * xp - vertz[i] * xa;
xt = vertx[i] * yp + mul64shr(zt, ...
vz[i] = mul64shr(zt, yp, 16) - vertx[i] * ya;
vx[i] = mul64shr(xt, zp, 16) - mul64shr(yt, ...
vy[i] = mul64shr(yt, zp, 16) + mul64shr(xt, ...
}
for (l = i = 0; i < 6; i++) {
centerz4[i] = vz[squar[l]] + vz[squar[l + 1]...
l = l + 4;
}
aFillRect0(w, 160, 160, 48, 0, 0x000000);
for (i = 0; i < 8; i++) {
t = (vz[i] + 13107200) >> 16;
t = 4915200 / t;
scx[i] = mul64shr(vx[i], t, 31) + 128;
scy[i] = mul64shr(vy[i], t, 31) + 80;
}
for (;;) {
m = j = 0;
for (i = 0; i < 6; i++) {
t = centerz4[i];
if (m < t) {
m = t;
j = i;
}
}
if (m == 0) break;
l = j * 4; centerz4[j] = 0;
k0 = squar[l];
k1 = squar[l + 1];
k2 = squar[l + 2];
e0x = vx[k1] - vx[k0];
e0y = vy[k1] - vy[k0];
e1x = vx[k2] - vx[k1];
e1y = vy[k2] - vy[k1];
if (mul64shr(e0x, e1y, 16) <= mul64shr(e0y, ...
l1 = l + 4;
k = squar[l + 3];
p0x = scx[k]; p0y = scy[k];
ymin = 99999; ymax = 0;
for (; l < l1; l++) {
k = squar[l];
p1x = scx[k]; p1y = scy[k];
if (ymin > p1y) { ymin = p1y; }
if (ymax < p1y) { ymax = p1y; }
if (p0y != p1y) {
if (p0y < p1y) {
buf = buf0; y0 = p0y; y1 = p...
} else {
buf = buf1; y0 = p1y; y1 = p...
}
x = x * 65536;
dx = dx * 65536;
dx = dx / (y1 - y0);
if (dx >= 0) {
x = x + 0x8000;
} else {
x = x - 0x8000;
}
++y1;
for (y = y0; y < y1; y++) {
buf[y] = x >> 16;
x = x + dx;
}
}
p0x = p1x; p0y = p1y;
}
c = col[j];
++ymax;
for (y = ymin; y < ymax; y++) {
p0x = buf0[y];
p1x = buf1[y];
if (p0x <= p1x) {
aFillRect0(w, p1x - p0x + 1, 1, ...
} else {
aFillRect0(w, p0x - p1x + 1, 1, ...
}
}
}
}
aWait(50);
if (aInkey(w, 1) != 0) break;
}
}
|http://essen.osask.jp/download/esb20191120c.png| |http:...
----
-''invader.c''
--[[K]]にとっては定番の、インベーダゲームのプログラムです...
--gprintDec()やbitblt()などの関数の処理内容が気になると思...
#include <acl.c>
#include "tl9builtin.c"
int fght[384] = {
0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,1,0,
0,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,0,
0,1,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,0,
0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
int invd[512] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,...
0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,...
0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...
0,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,...
0,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,...
0,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,...
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...
0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...
0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,...
0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...
0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...
0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,...
0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,...
0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,...
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
};
void aMain()
{
int inv[192];
int i, j, k, score, pnt, mwt0, fx, idir, wunit, ix, ...
AWindow *w;
w = aOpenWin(324, 228, "graphics", 1);
for (i = 0; i < 384; i++) {
fght[i] = fght[i] * 0x00ffff;
}
for (i = 0; i < 512; i++) {
invd[i] = invd[i] * 0x00ff00;
}
restart:
score = 0; pnt = 1; mwt0 = 20; fx = 18;
nxtinv:
ix = 7; iy = 1; invlin = 5;
ly = 0; lwt = 0; mwt = mwt0;
idir = 1; wunit = 1024;
for (i = 0; i < 6; i++) {
for (j = 0; j < 26; j++) {
inv[i * 32 + j] = j % 5;
}
}
for(;;) {
// 表示.
aFillRect0(w, 324, 228, 0, 0, 0x000000);
aDrawStr0(w, 34, 2, 0xffffff, 0x000000, "SCO...
gprintDec(w, 82, 2, 6, 0xffffff, 0x000000, scor...
gprintDec(w, 226, 2, 6, 0xffffff, 0x000000, high);
bitblt(w, 24, 16, fx * 8 + 2, 13 * 16 + 2, fght);
for (i = 0; i < 6; i++) {
for (j = 0; j < 26; j++) {
if (inv[i * 32 + j] == 1) {
bitblt(w, 32, 16, (ix + j) * 8 + 2, ...
}
}
}
if (ly != 0) {
aFillRect0(w, 2, 14, lx * 8 + 5, ly * 16 + 3...
}
// インベーダ全滅判定.
for (;;) {
for (i = 0; i < 26; i++) {
if (inv[invlin * 32 + i] != 0) goto skip0;
}
invlin = invlin - 1;
if (invlin < 0) {
mwt0 = mwt0 - mwt0 / 3;
aWait(1024);
goto nxtinv;
}
}
skip0:
// wait処理.
aWait(wunit);
wunit = 40;
lwt = lwt - 1;
// キー入力.
j = 0;
for (;;) {
i = aInkey(w, 1);
if (i == 0) break;
if (i == 27) goto end; // esc
if (i == 0x1024) { j = -1; }
if (i == 0x1025) { j = 1; }
if (i == 0x1026) { i = 32; }
if (i == 32) {
if (lwt <= 0) {
lwt = 15;
lx = fx + 1;
ly = 13;
}
}
}
// 自機の移動.
i = fx + j;
if (i >= 0) {
if (i <= 37) {
fx = i;
}
}
// レーザ移動.
if (ly > 0) {
ly = ly - 1;
if (ly == 0) {
pnt = pnt - 10;
if (pnt < 1) {
pnt = 1;
}
}
}
// あたり判定.
j = lx - ix;
k = ly - iy;
if (k >= 0) {
if (k <= 5) {
if (j >= 0) {
if (j < 24) {
i = inv[k * 32 + j];
if (i > 0) {
ly = 0;
j = j - i;
for (i = 0; i < 6; i++) {
inv[k * 32 + j + i] = 0;
}
score = score + pnt;
pnt++;
if (high < score) {
high = score;
}
}
}
}
}
}
// インベーダ移動.
if (mwt > 0) {
mwt = mwt - 1;
} else {
mwt = mwt0;
ix = ix + idir;
if (ix >= 0) {
if (ix <= 14) continue;
}
if (iy + invlin == 12) {
aDrawStr0(w, 122, 98, 0xff0000, 0x000000...
for (;;) {
aWait(128);
i = aInkey(w, 1);
if (i == 10) break;
if (i == 27) goto end; // esc
}
goto restart;
}
idir = idir * -1;
iy++;
ix = ix +idir;
}
}
end:
aWait(-1);
}
|http://k.osask.jp/files/esb20191218d.png|
** (4) "tl9builtin.c"の中身
-tl9builtin.cは、上記プログラム例をgccなどの普通のコンパ...
-TL-9aの組み込み関数の処理に相当する処理が書いてあります。
static inline int mul64shr(int i,int j, int k)
{
return ((long long) i) * ((long long) j) >> k;
}
static inline void printTime()
{
printf("time: %.3f[sec]\n", clock() / (double) CLOCK...
}
static inline int ff16sin(int x)
{
return (int) (sin(x * (2 * 3.14159265358979323 / 655...
}
static inline int ff16cos(int x)
{
return (int) (cos(x * (2 * 3.14159265358979323 / 655...
}
void gprintDec(AWindow *w, int x, int y, int l, int c, i...
{
char s[100];
sprintf(s, "%*d", l, i);
aDrawStr0(w, x, y, c, b, s);
}
void bitblt(AWindow *w, int sx, int sy, int x, int y, in...
{
AInt32 *q = &w->buf[x + y * w->xsiz];
int i, j;
for (j = 0; j < sy; j++) {
for (i = 0; i < sx; i++) {
q[i] = p[i];
}
p += sx;
q += w->xsiz;
}
}
** (5) 感想
-私は2020年にES-BASICを作りました。これはBASIC言語+アセ...
-今回のTL-9aは、これに対して785行で10.5KBです。ES-BASICは...
-いや、なんというかC言語プログラムがそのまま10.5KBの処理...
-TL-9aはソースコード行数を減らして見通しをよくするために...
-ちなみに今回使った式解釈アルゴリズムや構文解釈アルゴリズ...
-さらにTL-9aに数十行書き足せば、関数宣言や関数呼び出しが...
** (6) aclライブラリの入手方法
--Windowsの場合: (Windows専用版を使う方法と、SDL2.0対応...
---[[aclib21]](Windows専用版をMinGW-5.1.6で使う例)
---[[aclib07]](SDL2.0対応版をMinGW-5.1.6で使う例)
--MacOSの場合:
---準備中(とりあえず今は[[aclib06]]でしのいでください)
--Linuxの場合:
---[[aclib17]]
--Androidの場合: (Android 7.0以降が必要です。スマートフ...
---[[aclib08]] (SDL2.0対応版をTermux+clangで使う例)
--ラズベリーパイの場合:
---準備中(とりあえず今は[[aclib06]]でしのいでください)
--「はりぼてOS」の場合:
---準備中
--その他(SDL2.0とCの標準ライブラリを使った一般的なやり方...
---[[aclib06]]
* こめんと欄
#comment
終了行:
* 「はりぼて言語」について
-(by [[K]], 2021.02.24)
** (1) はじめに
-私は、「30日でできる!OS自作入門」みたいなノリで、「10日...
-それで、まずは自分でこのテキストでのゴールになりそうな言...
-もしかしたら「プログラミング言語自作入門のテキストの最後...
** (2) 基本情報 & ダウンロード
-言語処理系の名前: ''「TL-9a」''(開発コードネーム)
--名前については、「はりぼて言語」だからHL-9aとかにすれば...
--いやその最初はこんなに面白い言語になるとは思っていなく...
-ソースコード: ''C言語で785行''
--できるだけ機種依存しないように書いているので、多くの環...
--私は教材用のプログラムは一般に行数が少ないことが重要だ...
--もちろん行数を減らすテクニックの中には、可読性を大きく...
-実行ファイルの大きさ(参考): ''Windows用で 10.5KB''
--私はC言語プログラムの規模を行数だけで推し量るのは賢明で...
--しかしそんな小手先のごまかしをしても、実行ファイルの大...
--この10.5KBというサイズは、以下に説明する機能からすれば...
--なおこの10.5KBの中には以下のaclライブラリも静的リンクさ...
--そういう意味では、TL-9a本体だけならもっと小さいというこ...
--きっと多くのCプログラマは、今まで10KB以上のアプリを書い...
-利用ライブラリ: ''aclライブラリ''
--私は自作言語でグラフィックを扱うのが大好きで、この「は...
--もしtl9a.cを自前でコンパイルする場合(Windows以外の環境...
-言語のタイプ: ''スクリプト言語(インタプリタ)、JITコン...
--私は高速な実行が好きで、だからJITコンパイラを作るのが好...
--でもその分、実行速度はそれなりになります。処理内容によ...
--でも5倍で済むのならむしろ非JITコンパイラとしては優秀な...
--なお、「10日くらいでできる!プログラミング言語自作入門...
--さらに、このTL-9aをJITではない普通のコンパイラに改造す...
--(そもそもこのTL-9aは、内部では実行速度を上げるために内...
-基本的な機能説明: ''符号付き整数型・整数演算のみ対応、演...
--以下のプログラム例を見ると、なんだかすごくいろいろでき...
--aMain()という、aclライブラリにおけるmain関数を書いてい...
--なぜそんな仕様になっているのかといえば、「同じアプリケ...
--TL-9aの見た目がどんなにC言語っぽくても、TL-9aはC言語に...
--なお、以下のサンプルはaclライブラリを使えば、普通にgcc...
----
-''ダウンロード'': (tl9a.exeと以下のサンプルコードとtl9a...
--http://k.osask.jp/files/tl9a_demo.zip
--動かし方は、tl9a.exeを起動してから「run grd.c」とするか...
** (3) プログラム例 (TL-9aで実行できるプログラム)
-''grd.c''
--グラデーションを表示します。上記説明にある通り、#includ...
--aOpenWin(), aSetPix0(), aWait()は、TL-9aの組み込み関数...
#include <acl.c>
void aMain()
{
AWindow *w;
int x, y, c;
w = aOpenWin(256, 256, "grd", 1);
c = 0;
for (y = 0; y < 256; y++) {
for (x = 0; x < 256; x++) {
aSetPix0(w, x, y, c);
c = c + 0x100;
}
}
aWait(-1);
}
|http://k.osask.jp/files/esb20190827a.png|
----
-''mandel.c''
--マンデルブロー集合の描画プログラムです。上記説明にある...
--mul64shr()という関数の処理内容が気になると思いますが、...
#include <acl.c>
#include "tl9builtin.c"
void aMain()
{
AWindow *w;
int x, y, sx, sy, cx, cy, zx, zy, xx, yy, t, n, sn, c;
w = aOpenWin(512, 384, "mandel", 1);
for (y = 0; y < 384; y++) {
for (x = 0; x < 512; x++) {
sn = 0;
for (sx = 0; sx < 4; sx++) {
cx = (x * 4 + sx) * 56 + 4673536;
for (sy = 0; sy < 4; sy++) {
cy = (y * 4 + sy) * -56 - 124928;
zx = cx; zy = cy;
for (n = 1; n < 447; n++) {
xx = mul64shr(zx, zx, 24);
yy = mul64shr(zy, zy, 24);
t = xx + yy;
if (t > 0x4000000) break;
zy = mul64shr(zy, zx, 23);
zx = xx + cx - yy;
zy = zy + cy;
}
sn = sn + n;
}
}
n = sn >> 4;
c = aRgb8(n, 0, 0);
if (n > 255) {
c = aRgb8(0, 0, 0);
if (n != 447) {
c = aRgb8(255, n - 255, 0);
}
}
aSetPix0(w, x, y, c);
}
}
printTime();
aWait(-1);
}
|http://k.osask.jp/files/esb20190827b.png|
----
-''maze.c''
--迷路作成(穴掘り法)のプログラムです。上記説明にある通...
--乱数で迷路を作っているので、実行するたびに違う迷路が出...
#include <acl.c>
void aMain()
{
AWindow *w;
int i, x, y, xx, yy, d0, d1, d2, d3, d, dd;
w = aOpenWin(752, 496, "maze", 1);
aFillRect0(w, 752, 496, 0, 0, 0x00ff00);
aFillRect0(w, 16, 16, 16, 16, 0x000000);
for (i = 0; i < 1000000; i++) {
x = ((aXorShift32() & 0x7fffffff) % 23) * 2 + 1;
y = ((aXorShift32() & 0x7fffffff) % 15) * 2 + 1;
if (aGetPix(w, x * 16, y * 16) == 0x000000) {
for (;;) {
d0 = d1 = d2 = d3 = 0;
xx = x * 16;
yy = y * 16;
aFillRect0(w, 16, 16, xx, yy, 0x000000);
if (x != 45) { d0 = (aGetPix(w, xx + 16,...
if (x != 1) { d1 = (aGetPix(w, xx - 16,...
if (y != 29) { d2 = (aGetPix(w, xx, yy +...
if (y != 1) { d3 = (aGetPix(w, xx, yy -...
d = d0 + d1 + d2 + d3;
if (d == 0) break;
dd = (aXorShift32() & 0x7fffffff) % d;
if (d0) { if (dd == 0) { aFillRect0(w, 1...
if (d1) { if (dd == 0) { aFillRect0(w, 1...
if (d2) { if (dd == 0) { aFillRect0(w, 1...
if (d3) { if (dd == 0) { aFillRect0(w, 1...
}
}
}
aWait(-1);
}
|http://essen.osask.jp/download/esb20191120a.png|
----
-''kcube.c''
--[[K]]にとっては定番の、キューブ回転プログラムです。上記...
--mul64shr()やff16sin()などの関数の処理内容が気になると思...
#include <acl.c>
#include "tl9buitin.c"
int vertx[8] ={ 2, 2, 2, 2, 0, 0, 0, 0 };
int verty[8] ={ 2, 2, 0, 0, 2, 2, 0, 0 };
int vertz[8] ={ 2, 0, 2, 0, 2, 0, 2, 0 };
int squar[24] = { 0,4,6,2, 1,3,7,5, 0,2,3,1, 0,1,5,4, 4,...
int col[6] = { 0xff0000, 0x00ff00, 0xffff00, 0x0000ff, 0...
void aMain()
{
int vx[8]; int vy[8]; int vz[8];
int centerz4[6];
int scx[8]; int scy[8];
int buf0[160]; int buf1[160];
int i, j, k, l, thx, thy, thz, xp, xa, yp, ya, zp, z...
int k0, k1, k2, e0x, e0y, e1x, e1y, l1, p0x, p0y, p1...
int dx, *buf, y0, y1;
AWindow *w;
w = aOpenWin(256, 160, "kcube", 1);
for (i = 0; i < 8; i++) {
vertx[i] = (vertx[i] - 1) * 50;
verty[i] = (verty[i] - 1) * 50;
vertz[i] = (vertz[i] - 1) * 50;
}
thx = thy = thz = 0;
for (;;) {
thx = (thx + 182) & 0xffff;
thy = (thy + 273) & 0xffff;
thz = (thz + 364) & 0xffff;
xp = ff16cos(thx); xa = ff16sin(thx);
yp = ff16cos(thy); ya = ff16sin(thy);
zp = ff16cos(thz); za = ff16sin(thz);
for (i = 0; i < 8; i++) {
zt = vertz[i] * xp + verty[i] * xa;
yt = verty[i] * xp - vertz[i] * xa;
xt = vertx[i] * yp + mul64shr(zt, ...
vz[i] = mul64shr(zt, yp, 16) - vertx[i] * ya;
vx[i] = mul64shr(xt, zp, 16) - mul64shr(yt, ...
vy[i] = mul64shr(yt, zp, 16) + mul64shr(xt, ...
}
for (l = i = 0; i < 6; i++) {
centerz4[i] = vz[squar[l]] + vz[squar[l + 1]...
l = l + 4;
}
aFillRect0(w, 160, 160, 48, 0, 0x000000);
for (i = 0; i < 8; i++) {
t = (vz[i] + 13107200) >> 16;
t = 4915200 / t;
scx[i] = mul64shr(vx[i], t, 31) + 128;
scy[i] = mul64shr(vy[i], t, 31) + 80;
}
for (;;) {
m = j = 0;
for (i = 0; i < 6; i++) {
t = centerz4[i];
if (m < t) {
m = t;
j = i;
}
}
if (m == 0) break;
l = j * 4; centerz4[j] = 0;
k0 = squar[l];
k1 = squar[l + 1];
k2 = squar[l + 2];
e0x = vx[k1] - vx[k0];
e0y = vy[k1] - vy[k0];
e1x = vx[k2] - vx[k1];
e1y = vy[k2] - vy[k1];
if (mul64shr(e0x, e1y, 16) <= mul64shr(e0y, ...
l1 = l + 4;
k = squar[l + 3];
p0x = scx[k]; p0y = scy[k];
ymin = 99999; ymax = 0;
for (; l < l1; l++) {
k = squar[l];
p1x = scx[k]; p1y = scy[k];
if (ymin > p1y) { ymin = p1y; }
if (ymax < p1y) { ymax = p1y; }
if (p0y != p1y) {
if (p0y < p1y) {
buf = buf0; y0 = p0y; y1 = p...
} else {
buf = buf1; y0 = p1y; y1 = p...
}
x = x * 65536;
dx = dx * 65536;
dx = dx / (y1 - y0);
if (dx >= 0) {
x = x + 0x8000;
} else {
x = x - 0x8000;
}
++y1;
for (y = y0; y < y1; y++) {
buf[y] = x >> 16;
x = x + dx;
}
}
p0x = p1x; p0y = p1y;
}
c = col[j];
++ymax;
for (y = ymin; y < ymax; y++) {
p0x = buf0[y];
p1x = buf1[y];
if (p0x <= p1x) {
aFillRect0(w, p1x - p0x + 1, 1, ...
} else {
aFillRect0(w, p0x - p1x + 1, 1, ...
}
}
}
}
aWait(50);
if (aInkey(w, 1) != 0) break;
}
}
|http://essen.osask.jp/download/esb20191120c.png| |http:...
----
-''invader.c''
--[[K]]にとっては定番の、インベーダゲームのプログラムです...
--gprintDec()やbitblt()などの関数の処理内容が気になると思...
#include <acl.c>
#include "tl9builtin.c"
int fght[384] = {
0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,1,0,
0,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,0,
0,1,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,0,
0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
int invd[512] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,...
0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,...
0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...
0,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,...
0,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,...
0,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,...
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...
0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...
0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,...
0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...
0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,...
0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,...
0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,...
0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,...
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...
};
void aMain()
{
int inv[192];
int i, j, k, score, pnt, mwt0, fx, idir, wunit, ix, ...
AWindow *w;
w = aOpenWin(324, 228, "graphics", 1);
for (i = 0; i < 384; i++) {
fght[i] = fght[i] * 0x00ffff;
}
for (i = 0; i < 512; i++) {
invd[i] = invd[i] * 0x00ff00;
}
restart:
score = 0; pnt = 1; mwt0 = 20; fx = 18;
nxtinv:
ix = 7; iy = 1; invlin = 5;
ly = 0; lwt = 0; mwt = mwt0;
idir = 1; wunit = 1024;
for (i = 0; i < 6; i++) {
for (j = 0; j < 26; j++) {
inv[i * 32 + j] = j % 5;
}
}
for(;;) {
// 表示.
aFillRect0(w, 324, 228, 0, 0, 0x000000);
aDrawStr0(w, 34, 2, 0xffffff, 0x000000, "SCO...
gprintDec(w, 82, 2, 6, 0xffffff, 0x000000, scor...
gprintDec(w, 226, 2, 6, 0xffffff, 0x000000, high);
bitblt(w, 24, 16, fx * 8 + 2, 13 * 16 + 2, fght);
for (i = 0; i < 6; i++) {
for (j = 0; j < 26; j++) {
if (inv[i * 32 + j] == 1) {
bitblt(w, 32, 16, (ix + j) * 8 + 2, ...
}
}
}
if (ly != 0) {
aFillRect0(w, 2, 14, lx * 8 + 5, ly * 16 + 3...
}
// インベーダ全滅判定.
for (;;) {
for (i = 0; i < 26; i++) {
if (inv[invlin * 32 + i] != 0) goto skip0;
}
invlin = invlin - 1;
if (invlin < 0) {
mwt0 = mwt0 - mwt0 / 3;
aWait(1024);
goto nxtinv;
}
}
skip0:
// wait処理.
aWait(wunit);
wunit = 40;
lwt = lwt - 1;
// キー入力.
j = 0;
for (;;) {
i = aInkey(w, 1);
if (i == 0) break;
if (i == 27) goto end; // esc
if (i == 0x1024) { j = -1; }
if (i == 0x1025) { j = 1; }
if (i == 0x1026) { i = 32; }
if (i == 32) {
if (lwt <= 0) {
lwt = 15;
lx = fx + 1;
ly = 13;
}
}
}
// 自機の移動.
i = fx + j;
if (i >= 0) {
if (i <= 37) {
fx = i;
}
}
// レーザ移動.
if (ly > 0) {
ly = ly - 1;
if (ly == 0) {
pnt = pnt - 10;
if (pnt < 1) {
pnt = 1;
}
}
}
// あたり判定.
j = lx - ix;
k = ly - iy;
if (k >= 0) {
if (k <= 5) {
if (j >= 0) {
if (j < 24) {
i = inv[k * 32 + j];
if (i > 0) {
ly = 0;
j = j - i;
for (i = 0; i < 6; i++) {
inv[k * 32 + j + i] = 0;
}
score = score + pnt;
pnt++;
if (high < score) {
high = score;
}
}
}
}
}
}
// インベーダ移動.
if (mwt > 0) {
mwt = mwt - 1;
} else {
mwt = mwt0;
ix = ix + idir;
if (ix >= 0) {
if (ix <= 14) continue;
}
if (iy + invlin == 12) {
aDrawStr0(w, 122, 98, 0xff0000, 0x000000...
for (;;) {
aWait(128);
i = aInkey(w, 1);
if (i == 10) break;
if (i == 27) goto end; // esc
}
goto restart;
}
idir = idir * -1;
iy++;
ix = ix +idir;
}
}
end:
aWait(-1);
}
|http://k.osask.jp/files/esb20191218d.png|
** (4) "tl9builtin.c"の中身
-tl9builtin.cは、上記プログラム例をgccなどの普通のコンパ...
-TL-9aの組み込み関数の処理に相当する処理が書いてあります。
static inline int mul64shr(int i,int j, int k)
{
return ((long long) i) * ((long long) j) >> k;
}
static inline void printTime()
{
printf("time: %.3f[sec]\n", clock() / (double) CLOCK...
}
static inline int ff16sin(int x)
{
return (int) (sin(x * (2 * 3.14159265358979323 / 655...
}
static inline int ff16cos(int x)
{
return (int) (cos(x * (2 * 3.14159265358979323 / 655...
}
void gprintDec(AWindow *w, int x, int y, int l, int c, i...
{
char s[100];
sprintf(s, "%*d", l, i);
aDrawStr0(w, x, y, c, b, s);
}
void bitblt(AWindow *w, int sx, int sy, int x, int y, in...
{
AInt32 *q = &w->buf[x + y * w->xsiz];
int i, j;
for (j = 0; j < sy; j++) {
for (i = 0; i < sx; i++) {
q[i] = p[i];
}
p += sx;
q += w->xsiz;
}
}
** (5) 感想
-私は2020年にES-BASICを作りました。これはBASIC言語+アセ...
-今回のTL-9aは、これに対して785行で10.5KBです。ES-BASICは...
-いや、なんというかC言語プログラムがそのまま10.5KBの処理...
-TL-9aはソースコード行数を減らして見通しをよくするために...
-ちなみに今回使った式解釈アルゴリズムや構文解釈アルゴリズ...
-さらにTL-9aに数十行書き足せば、関数宣言や関数呼び出しが...
** (6) aclライブラリの入手方法
--Windowsの場合: (Windows専用版を使う方法と、SDL2.0対応...
---[[aclib21]](Windows専用版をMinGW-5.1.6で使う例)
---[[aclib07]](SDL2.0対応版をMinGW-5.1.6で使う例)
--MacOSの場合:
---準備中(とりあえず今は[[aclib06]]でしのいでください)
--Linuxの場合:
---[[aclib17]]
--Androidの場合: (Android 7.0以降が必要です。スマートフ...
---[[aclib08]] (SDL2.0対応版をTermux+clangで使う例)
--ラズベリーパイの場合:
---準備中(とりあえず今は[[aclib06]]でしのいでください)
--「はりぼてOS」の場合:
---準備中
--その他(SDL2.0とCの標準ライブラリを使った一般的なやり方...
---[[aclib06]]
* こめんと欄
#comment
ページ名: