* HLX-003の補足ページ#1
-(by [[K]], 2021.11.30)
** (1) C言語ではできるけど、HLX-003ではできないこと(将来のバージョンでは改善されます)。
-[1]浮動小数点演算はできません、ポインタ演算も代入しかできません(加減算はうまくいきません)。
-[2]配列は一次元のみです。配列変数に対して、++や--はできません(つまりa[i]++;ができない)。+=や*=もできません。でも代入はできるのでa[i]=a[i]+2;ならできます。
-[3]標準関数はほとんど使えません。
-[4]関数は void aMain() { ... } しか宣言できません。宣言した関数を呼び出すこともできません。
-[5]構造体も使えません。
-[6]配列宣言時の初期化では、定数式が使えません。定数は使えます。
** (2) mandel1_opt.c
#include <acl.c>
#ifdef AUSE_HLX
regVarOpt(0, zx, zy, xx, yy, cx, cy, n, sn); // for spd.
regVarOpt(1, n, zx, zy, x, y, sy, sx, c, sn); // for siz.
regVarOpt(15, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); // for no-opt. (reg-var off)
regVarOpt(16, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); // for spd. (reg-var off)
regVarOpt(17, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); // for siz. (reg-var off)
#endif
void aMain()
{
AWindow *w = aOpenWin(512, 384, "mandel", 1);
AInt x, y;
for (y = 0; y < 384; y++) {
for (x = 0; x < 512; x++) {
AInt sn = 0, sx, sy, n;
AInt c, cx, cy, zx, zy, xx, yy;
for (sx = 0; sx < 4; sx++) {
// cx = (x * 4 + sx) * 56 + 4673536;
cx = x; cx *= 4; cx += sx; cx *= 56; cx += 4673536;
for (sy = 0; sy < 4; sy++) {
// cy = (y * 4 + sy) * (-56) - 124928;
cy = y; cy *= 4; cy += sy; cy *= -56; cy -= 124928;
zx = cx; zy = cy;
for (n = 1; n < 447; n++) {
xx = zx * zx; xx = xx >> 24; // aMul64Shr(zx, zx, 24);
yy = zy * zy; yy = yy >> 24; // aMul64Shr(zy, zy, 24);
if (xx + yy > 0x4000000) break;
zy *= zx; zy = zy >> 23; // aMul64Shr(zy, zx, 23);
zx = xx; zx += cx; zx -= yy; // zx = xx + cx - yy;
zy += cy;
}
sn += n;
}
}
n = sn >> 4;
c = aRgb8(n, 0, 0);
if (n >= 256) {
c = aRgb8(0, 0, 0);
if (n < 447)
c = aRgb8(255, n - 255, 0);
}
aSetPix0(w, x, y, c);
}
// aLeapFlushAll(w, 128);
}
aPrintTime();
aWait(-1);
}