nuclear@0: #define FB_ADDR ((unsigned char*)0x4000) nuclear@0: #define ATTR_ADDR ((unsigned char*)0x5800) nuclear@0: #define LINESKIP (256 / 8) nuclear@0: nuclear@0: unsigned char mbrot(int px, int py); nuclear@0: nuclear@0: int main() nuclear@0: { nuclear@0: unsigned int i, j, k, start; nuclear@0: nuclear@3: /* turn the border black */ nuclear@3: #asm nuclear@3: xor a nuclear@3: out (254), a nuclear@3: #endasm nuclear@3: nuclear@0: for(;;) { nuclear@3: unsigned char *ptr = FB_ADDR; nuclear@0: start = 0; nuclear@0: nuclear@0: for(i=0; i<192; i++) { nuclear@0: unsigned int banky = i & 0x3f; nuclear@1: unsigned int cell = banky >> 3; nuclear@1: unsigned int cline = banky & 0x7; nuclear@3: unsigned int y = (cline << 3) + cell + start; nuclear@3: nuclear@3: /*unsigned char *ptr = FB_ADDR | ((i & 0xc0) << 5) | nuclear@3: ((i & 0x38) << 2) | ((i & 7) << 8);*/ nuclear@0: nuclear@0: for(j=0; j<32; j++) { /* 256 pixels, 8 pixels per byte */ nuclear@0: unsigned char pixel = 0; nuclear@0: for(k=0; k<8; k++) { nuclear@3: unsigned char res = mbrot((j << 3) + k, y); nuclear@0: pixel = pixel | (res & 1); nuclear@0: if(k < 7) pixel <<= 1; nuclear@0: } nuclear@0: *ptr++ = pixel; nuclear@0: } nuclear@0: nuclear@0: if((i & 0x3f) == 0x3f) { nuclear@0: start += 0x40; nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: #define int2fix8_8(i) ((i) << 8) nuclear@0: #define fix_mul8_8(a, b) ((a >> 4) * (b >> 4)) nuclear@0: #define int2fix5_11(i) ((i) << 11) nuclear@0: #define fix_mul5_11(a, b) ((a >> 5) * (b >> 6)) nuclear@0: nuclear@0: unsigned char mbrot(int px, int py) nuclear@0: { nuclear@0: unsigned char i; nuclear@0: int cx, cy, zx, zy, x, y, len; nuclear@1: int xop1, xop2, yop1, yop2; nuclear@1: int zxop1, zxop2, zyop1, zyop2; nuclear@0: nuclear@0: cx = int2fix8_8(px - 192) >> 6; nuclear@0: cy = int2fix8_8(py - 96) >> 6; nuclear@0: nuclear@0: cx <<= 3; nuclear@0: cy <<= 3; nuclear@0: nuclear@0: zx = cx; nuclear@0: zy = cy; nuclear@0: nuclear@0: for(i=0; i<32; i++) { nuclear@1: /*x = fix_mul5_11(zx, zx) - fix_mul5_11(zy, zy) + cx; nuclear@1: y = fix_mul5_11(zy, zx) + fix_mul5_11(zx, zy) + cy;*/ nuclear@1: zxop1 = zx >> 5; nuclear@1: zxop2 = zxop1 >> 1; nuclear@1: zyop1 = zy >> 5; nuclear@1: zyop2 = zyop1 >> 1; nuclear@0: nuclear@1: x = zxop1 * zxop2 - zyop1 * zyop2 + cx; nuclear@1: y = zyop1 * zxop2 + zxop1 * zyop2 + cy; nuclear@1: nuclear@1: /*len = fix_mul5_11(x, x) + fix_mul5_11(y, y);*/ nuclear@1: xop1 = x >> 5; nuclear@1: xop2 = xop1 >> 1; nuclear@1: yop1 = y >> 5; nuclear@1: yop2 = yop1 >> 1; nuclear@1: len = xop1 * xop2 + yop1 * yop2; nuclear@1: nuclear@1: /*if(len > int2fix5_11(4)) return 0;*/ nuclear@3: if(len > 8192) return 1; nuclear@0: nuclear@0: zx = x; nuclear@0: zy = y; nuclear@0: } nuclear@0: nuclear@3: return 0; nuclear@0: }