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@4
|
9 unsigned char i, j, k, start;
|
nuclear@0
|
10
|
nuclear@3
|
11 /* turn the border black */
|
nuclear@3
|
12 #asm
|
nuclear@3
|
13 xor a
|
nuclear@3
|
14 out (254), a
|
nuclear@3
|
15 #endasm
|
nuclear@3
|
16
|
nuclear@0
|
17 for(;;) {
|
nuclear@3
|
18 unsigned char *ptr = FB_ADDR;
|
nuclear@0
|
19 start = 0;
|
nuclear@0
|
20
|
nuclear@0
|
21 for(i=0; i<192; i++) {
|
nuclear@4
|
22 unsigned char banky = i & 0x3f;
|
nuclear@4
|
23 unsigned char cell = banky >> 3;
|
nuclear@4
|
24 unsigned char cline = banky & 0x7;
|
nuclear@4
|
25 unsigned char y = (cline << 3) + cell + start;
|
nuclear@3
|
26
|
nuclear@3
|
27 /*unsigned char *ptr = FB_ADDR | ((i & 0xc0) << 5) |
|
nuclear@3
|
28 ((i & 0x38) << 2) | ((i & 7) << 8);*/
|
nuclear@0
|
29
|
nuclear@0
|
30 for(j=0; j<32; j++) { /* 256 pixels, 8 pixels per byte */
|
nuclear@0
|
31 unsigned char pixel = 0;
|
nuclear@0
|
32 for(k=0; k<8; k++) {
|
nuclear@3
|
33 unsigned char res = mbrot((j << 3) + k, y);
|
nuclear@0
|
34 pixel = pixel | (res & 1);
|
nuclear@0
|
35 if(k < 7) pixel <<= 1;
|
nuclear@0
|
36 }
|
nuclear@0
|
37 *ptr++ = pixel;
|
nuclear@0
|
38 }
|
nuclear@0
|
39
|
nuclear@0
|
40 if((i & 0x3f) == 0x3f) {
|
nuclear@0
|
41 start += 0x40;
|
nuclear@0
|
42 }
|
nuclear@0
|
43 }
|
nuclear@0
|
44 }
|
nuclear@0
|
45 }
|
nuclear@0
|
46
|
nuclear@0
|
47 #define int2fix8_8(i) ((i) << 8)
|
nuclear@0
|
48 #define fix_mul8_8(a, b) ((a >> 4) * (b >> 4))
|
nuclear@0
|
49 #define int2fix5_11(i) ((i) << 11)
|
nuclear@0
|
50 #define fix_mul5_11(a, b) ((a >> 5) * (b >> 6))
|
nuclear@0
|
51
|
nuclear@0
|
52 unsigned char mbrot(int px, int py)
|
nuclear@0
|
53 {
|
nuclear@0
|
54 unsigned char i;
|
nuclear@0
|
55 int cx, cy, zx, zy, x, y, len;
|
nuclear@1
|
56 int xop1, xop2, yop1, yop2;
|
nuclear@1
|
57 int zxop1, zxop2, zyop1, zyop2;
|
nuclear@0
|
58
|
nuclear@0
|
59 cx = int2fix8_8(px - 192) >> 6;
|
nuclear@0
|
60 cy = int2fix8_8(py - 96) >> 6;
|
nuclear@0
|
61
|
nuclear@0
|
62 cx <<= 3;
|
nuclear@0
|
63 cy <<= 3;
|
nuclear@0
|
64
|
nuclear@0
|
65 zx = cx;
|
nuclear@0
|
66 zy = cy;
|
nuclear@0
|
67
|
nuclear@0
|
68 for(i=0; i<32; i++) {
|
nuclear@1
|
69 /*x = fix_mul5_11(zx, zx) - fix_mul5_11(zy, zy) + cx;
|
nuclear@1
|
70 y = fix_mul5_11(zy, zx) + fix_mul5_11(zx, zy) + cy;*/
|
nuclear@1
|
71 zxop1 = zx >> 5;
|
nuclear@1
|
72 zxop2 = zxop1 >> 1;
|
nuclear@1
|
73 zyop1 = zy >> 5;
|
nuclear@1
|
74 zyop2 = zyop1 >> 1;
|
nuclear@0
|
75
|
nuclear@1
|
76 x = zxop1 * zxop2 - zyop1 * zyop2 + cx;
|
nuclear@1
|
77 y = zyop1 * zxop2 + zxop1 * zyop2 + cy;
|
nuclear@1
|
78
|
nuclear@1
|
79 /*len = fix_mul5_11(x, x) + fix_mul5_11(y, y);*/
|
nuclear@1
|
80 xop1 = x >> 5;
|
nuclear@1
|
81 xop2 = xop1 >> 1;
|
nuclear@1
|
82 yop1 = y >> 5;
|
nuclear@1
|
83 yop2 = yop1 >> 1;
|
nuclear@1
|
84 len = xop1 * xop2 + yop1 * yop2;
|
nuclear@1
|
85
|
nuclear@1
|
86 /*if(len > int2fix5_11(4)) return 0;*/
|
nuclear@3
|
87 if(len > 8192) return 1;
|
nuclear@0
|
88
|
nuclear@0
|
89 zx = x;
|
nuclear@0
|
90 zy = y;
|
nuclear@0
|
91 }
|
nuclear@0
|
92
|
nuclear@3
|
93 return 0;
|
nuclear@0
|
94 }
|