rev |
line source |
nuclear@0
|
1 #define FB_ADDR ((unsigned char*)0x4000)
|
nuclear@0
|
2 #define ATTR_ADDR ((unsigned char*)0x5800)
|
nuclear@0
|
3 #define LINESKIP (256 / 8)
|
nuclear@0
|
4
|
nuclear@0
|
5 unsigned char mbrot(int px, int py);
|
nuclear@0
|
6
|
nuclear@0
|
7 int main()
|
nuclear@0
|
8 {
|
nuclear@0
|
9 unsigned int i, j, k, start;
|
nuclear@0
|
10
|
nuclear@0
|
11 for(;;) {
|
nuclear@0
|
12 start = 0;
|
nuclear@0
|
13
|
nuclear@0
|
14 for(i=0; i<192; i++) {
|
nuclear@0
|
15 unsigned int banky = i & 0x3f;
|
nuclear@0
|
16 unsigned int cell = banky / 8;
|
nuclear@0
|
17 unsigned int cline = banky % 8;
|
nuclear@0
|
18 unsigned int memline = cell + cline * 8;
|
nuclear@0
|
19 unsigned char *ptr = FB_ADDR + (start + memline) * LINESKIP;
|
nuclear@0
|
20
|
nuclear@0
|
21 for(j=0; j<32; j++) { /* 256 pixels, 8 pixels per byte */
|
nuclear@0
|
22 unsigned char pixel = 0;
|
nuclear@0
|
23 for(k=0; k<8; k++) {
|
nuclear@0
|
24 unsigned char res = mbrot((j << 3) + k, i);
|
nuclear@0
|
25 pixel = pixel | (res & 1);
|
nuclear@0
|
26 if(k < 7) pixel <<= 1;
|
nuclear@0
|
27 }
|
nuclear@0
|
28 *ptr++ = pixel;
|
nuclear@0
|
29 }
|
nuclear@0
|
30
|
nuclear@0
|
31 if((i & 0x3f) == 0x3f) {
|
nuclear@0
|
32 start += 0x40;
|
nuclear@0
|
33 }
|
nuclear@0
|
34 }
|
nuclear@0
|
35 }
|
nuclear@0
|
36 }
|
nuclear@0
|
37
|
nuclear@0
|
38 #define int2fix8_8(i) ((i) << 8)
|
nuclear@0
|
39 #define fix_mul8_8(a, b) ((a >> 4) * (b >> 4))
|
nuclear@0
|
40 #define int2fix5_11(i) ((i) << 11)
|
nuclear@0
|
41 #define fix_mul5_11(a, b) ((a >> 5) * (b >> 6))
|
nuclear@0
|
42
|
nuclear@0
|
43 unsigned char mbrot(int px, int py)
|
nuclear@0
|
44 {
|
nuclear@0
|
45 unsigned char i;
|
nuclear@0
|
46 int cx, cy, zx, zy, x, y, len;
|
nuclear@0
|
47
|
nuclear@0
|
48 cx = int2fix8_8(px - 192) >> 6;
|
nuclear@0
|
49 cy = int2fix8_8(py - 96) >> 6;
|
nuclear@0
|
50
|
nuclear@0
|
51 cx <<= 3;
|
nuclear@0
|
52 cy <<= 3;
|
nuclear@0
|
53
|
nuclear@0
|
54 zx = cx;
|
nuclear@0
|
55 zy = cy;
|
nuclear@0
|
56
|
nuclear@0
|
57 for(i=0; i<32; i++) {
|
nuclear@0
|
58 x = fix_mul5_11(zx, zx) - fix_mul5_11(zy, zy) + cx;
|
nuclear@0
|
59 y = fix_mul5_11(zy, zx) + fix_mul5_11(zx, zy) + cy;
|
nuclear@0
|
60 len = fix_mul5_11(x, x) + fix_mul5_11(y, y);
|
nuclear@0
|
61
|
nuclear@0
|
62 if(len > int2fix5_11(4)) return 0;
|
nuclear@0
|
63
|
nuclear@0
|
64 zx = x;
|
nuclear@0
|
65 zy = y;
|
nuclear@0
|
66 }
|
nuclear@0
|
67
|
nuclear@0
|
68 return 1;
|
nuclear@0
|
69 }
|