spectrum_cmbrot

annotate test.c @ 0:e56d8b0eee4b

spectrum fractal :)
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 17 Feb 2014 10:17:17 +0200
parents
children c2815c765fea
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 }