spectrum_cmbrot

view test.c @ 1:c2815c765fea

done
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 17 Feb 2014 11:00:23 +0200
parents e56d8b0eee4b
children
line source
1 #define FB_ADDR ((unsigned char*)0x4000)
2 #define ATTR_ADDR ((unsigned char*)0x5800)
3 #define LINESKIP (256 / 8)
5 unsigned char mbrot(int px, int py);
7 int main()
8 {
9 unsigned int i, j, k, start;
11 for(;;) {
12 start = 0;
14 for(i=0; i<192; i++) {
15 unsigned int banky = i & 0x3f;
16 unsigned int cell = banky >> 3;
17 unsigned int cline = banky & 0x7;
18 unsigned int memline = cell + (cline << 3);
19 unsigned char *ptr = FB_ADDR + (start + memline) * LINESKIP;
21 for(j=0; j<32; j++) { /* 256 pixels, 8 pixels per byte */
22 unsigned char pixel = 0;
23 for(k=0; k<8; k++) {
24 unsigned char res = mbrot((j << 3) + k, i);
25 pixel = pixel | (res & 1);
26 if(k < 7) pixel <<= 1;
27 }
28 *ptr++ = pixel;
29 }
31 if((i & 0x3f) == 0x3f) {
32 start += 0x40;
33 }
34 }
35 }
36 }
38 #define int2fix8_8(i) ((i) << 8)
39 #define fix_mul8_8(a, b) ((a >> 4) * (b >> 4))
40 #define int2fix5_11(i) ((i) << 11)
41 #define fix_mul5_11(a, b) ((a >> 5) * (b >> 6))
43 unsigned char mbrot(int px, int py)
44 {
45 unsigned char i;
46 int cx, cy, zx, zy, x, y, len;
47 int xop1, xop2, yop1, yop2;
48 int zxop1, zxop2, zyop1, zyop2;
50 cx = int2fix8_8(px - 192) >> 6;
51 cy = int2fix8_8(py - 96) >> 6;
53 cx <<= 3;
54 cy <<= 3;
56 zx = cx;
57 zy = cy;
59 for(i=0; i<32; i++) {
60 /*x = fix_mul5_11(zx, zx) - fix_mul5_11(zy, zy) + cx;
61 y = fix_mul5_11(zy, zx) + fix_mul5_11(zx, zy) + cy;*/
62 zxop1 = zx >> 5;
63 zxop2 = zxop1 >> 1;
64 zyop1 = zy >> 5;
65 zyop2 = zyop1 >> 1;
67 x = zxop1 * zxop2 - zyop1 * zyop2 + cx;
68 y = zyop1 * zxop2 + zxop1 * zyop2 + cy;
70 /*len = fix_mul5_11(x, x) + fix_mul5_11(y, y);*/
71 xop1 = x >> 5;
72 xop2 = xop1 >> 1;
73 yop1 = y >> 5;
74 yop2 = yop1 >> 1;
75 len = xop1 * xop2 + yop1 * yop2;
77 /*if(len > int2fix5_11(4)) return 0;*/
78 if(len > 8192) return 0;
80 zx = x;
81 zy = y;
82 }
84 return 1;
85 }