# HG changeset patch # User John Tsiombikas # Date 1392625037 -7200 # Node ID e56d8b0eee4b17ac62941b52e6e199791f7b1d50 spectrum fractal :) diff -r 000000000000 -r e56d8b0eee4b Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Makefile Mon Feb 17 10:17:17 2014 +0200 @@ -0,0 +1,16 @@ +src = test.c +obj = $(src:.c=.o) + +bin = test.tap + +CC = zcc +CFLAGS = +zx -pragma-define=myzorg=28000 +LDFLAGS = -create-app + +$(bin): $(obj) + rm -f $(bin) + $(CC) $(CFLAGS) -o $@ $(LDFLAGS) $(obj) + +.PHONY: clean +clean: + rm -f $(obj) $(bin) diff -r 000000000000 -r e56d8b0eee4b RUN --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RUN Mon Feb 17 10:17:17 2014 +0200 @@ -0,0 +1,3 @@ +#!/bin/sh + +fuse-sdl -g 3x --tape $* diff -r 000000000000 -r e56d8b0eee4b test.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test.c Mon Feb 17 10:17:17 2014 +0200 @@ -0,0 +1,69 @@ +#define FB_ADDR ((unsigned char*)0x4000) +#define ATTR_ADDR ((unsigned char*)0x5800) +#define LINESKIP (256 / 8) + +unsigned char mbrot(int px, int py); + +int main() +{ + unsigned int i, j, k, start; + + for(;;) { + start = 0; + + for(i=0; i<192; i++) { + unsigned int banky = i & 0x3f; + unsigned int cell = banky / 8; + unsigned int cline = banky % 8; + unsigned int memline = cell + cline * 8; + unsigned char *ptr = FB_ADDR + (start + memline) * LINESKIP; + + for(j=0; j<32; j++) { /* 256 pixels, 8 pixels per byte */ + unsigned char pixel = 0; + for(k=0; k<8; k++) { + unsigned char res = mbrot((j << 3) + k, i); + pixel = pixel | (res & 1); + if(k < 7) pixel <<= 1; + } + *ptr++ = pixel; + } + + if((i & 0x3f) == 0x3f) { + start += 0x40; + } + } + } +} + +#define int2fix8_8(i) ((i) << 8) +#define fix_mul8_8(a, b) ((a >> 4) * (b >> 4)) +#define int2fix5_11(i) ((i) << 11) +#define fix_mul5_11(a, b) ((a >> 5) * (b >> 6)) + +unsigned char mbrot(int px, int py) +{ + unsigned char i; + int cx, cy, zx, zy, x, y, len; + + cx = int2fix8_8(px - 192) >> 6; + cy = int2fix8_8(py - 96) >> 6; + + cx <<= 3; + cy <<= 3; + + zx = cx; + zy = cy; + + for(i=0; i<32; i++) { + x = fix_mul5_11(zx, zx) - fix_mul5_11(zy, zy) + cx; + y = fix_mul5_11(zy, zx) + fix_mul5_11(zx, zy) + cy; + len = fix_mul5_11(x, x) + fix_mul5_11(y, y); + + if(len > int2fix5_11(4)) return 0; + + zx = x; + zy = y; + } + + return 1; +}