spectrum_cmbrot

annotate mbrot.c @ 4:3ac0c33742cf

changed to 8bit arithmetic for the outer loop
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 17 Feb 2014 20:33:39 +0200
parents 8e7f17958dbb
children
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 }