acl4の開発ログ #07
2026.03.04(水) #0
2026.03.04(水) #1
- このプログラムを実行すると、私の好きなマンデルブロー集合の画像が出ます。
- だからこれを動かしたいです。
#define x R00
#define y R01
#define c R02
#define sx R03
#define sy R04
#define cx R05
#define cy R06
#define zx R07
#define zy R08
#define xx R09
#define yy R0a
#define n R0b
#define sn R0c
#define t0 c
#define lp0 L0000
#define lp1 L0001
#define lp2 L0002
#define lp3 L0003
#define lp4 L0004
#define sk0 L0005
#define sk1 L0006
Lod_RI(x, 512); Lod_RI(y, 384); Dbg_OpenWin_RR(x, y);
Lod_RI(y, 0); Lbl_T(lp0); // for (y = 0; y < 384; y++) {
Lod_RI(x, 0); Lbl_T(lp1); // for (x = 0; x < 512; x++) {
Lod_RI(sn, 0);
Lod_RI(sx, 0); Lbl_T(lp2); // for (sx = 0; sx < 4; sx++) {
Lod_RR(cx, x); Mul_RI(cx, 4); Add_RR(cx, sx); Mul_RI(cx, 56); Add_RI(cx, 4673536);
Lod_RI(sy, 0); Lbl_T(lp3); // for (sy = 0; sy < 4; sy++) {
Lod_RR(cy, y); Mul_RI(cy, 4); Add_RR(cy, sy); Mul_RI(cy, -56); Add_RI(cy, -124928);
Lod_RR(zx, cx); Lod_RR(zy, cy);
Lod_RI(n, 1); Lbl_T(lp4); // for (n = 1; n < 447; n++) {
Mul64Shr_RRRI(xx, zx, zx, 24);
Mul64Shr_RRRI(yy, zy, zy, 24);
Lod_RR(t0, xx); Add_RR(t0, yy); Jgt_RIT(t0, 0x4000000, sk0);
Mul64Shr_RRRI(zy, zy, zx, 23);
Lod_RR(zx, xx); Add_RR(zx, cx); Sub_RR(zx, yy);
Add_RR(zy, cy);
Add_RI(n, 1); Jlt_RIT(n, 447, lp4);
Lbl_T(sk0);
Add_RR(sn, n);
Add_RI(sy, 1); Jlt_RIT(sy, 4, lp3);
Add_RI(sx, 1); Jlt_RIT(sx, 4, lp2);
Shr_RI(sn, 4);
Lod_RR(c, sn); Mul_RI(c, 256);
Jlt_RIT(sn, 256, sk1); // if (sn >= 256) {
Lod_RI(c, 0);
Jge_RIT(sn, 447, sk1); // if (sn < 447) {
Lod_RR(c, sn); Add_RI(c, 0xfe01);
Lbl_T(sk1);
Mul_RI(c, 256);
Dbg_SetPix_RRR(x, y, c);
Add_RI(x, 1); Jlt_RIT(x, 512, lp1);
Add_RI(y, 1); Jlt_RIT(y, 384, lp0);
Dbg_Ret_I(0);
- ちなみにこれは以下の定義を使えばC言語として動きます(この方法でデバッグしました)。
#define Lbl_T(t) t:
#define Lod_RI(r, i) r=i
#define Lod_RR(r, s) r=s
#define Add_RI(r, i) r+=i
#define Add_RR(r, s) r+=s
#define Sub_RR(r, s) r-=s
#define Mul_RI(r, i) r*=i
#define Shr_RI(r, i) r>>=i
#define Jlt_RIT(r, i, t) if(r< i)goto t
#define Jge_RIT(r, i, t) if(r>=i)goto t
#define Jgt_RIT(r, i, t) if(r> i)goto t
#define Mul64Shr_RRRI(r, s, t, i) r=(intptr_t)(((int64_t)s*(int64_t)t)>>i)
#define Dbg_OpenWin_RR(x, y) a_Win win[1]; a_Win_ini(_arg_ win, x, y, "graphic", 0)
#define Dbg_SetPix_RRR(x, y, c) setPix0(win, x, y, c)
#define Dbg_Ret_I(i) a_Win_flushAll0(win); return i
2026.03.04(水) #2
- 拡張性重視だと速度が落ちて、速度重視だと拡張性が落ちるので、どうしたらいいかいろいろ試しています。
こめんと欄