UrForth: some fixes ;-)
[urasm.git] / samples / mandel.zas
blob28358145337ca70b01ba898caebc92271b9e86b7
1 ; (c) John Metcalf
2 ; http://www.retroprogramming.com/2014/03/plotting-mandelbrot-set-on-zx-spectrum.html
4   org 60000
5   ld de,255*256+191
6 XLOOP:
7   push de
8   ld hl,-180   ; x-coordinate
9   ld e,d
10   call SCALE
11   ld (XPOS),bc
12   pop de
13 YLOOP:
14   push de
15   ld hl,-96    ; y-coordinate
16   call SCALE
17   ld (YPOS),bc
18   ld hl,0
19   ld (IMAG),hl
20   ld (REAL),hl
21   ld b,15      ; iterations
22 ITER:
23   push bc
24   ld bc,(IMAG)
25   ld hl,(REAL)
26   or a
27   sbc hl,bc
28   ld d,h
29   ld e,l
30   add hl,bc
31   add hl,bc
32   call FIXMUL
33   ld de,(XPOS)
34   add hl,de
35   ld de,(REAL)
36   ld (REAL),hl
37   ld hl,(IMAG)
38   call FIXMUL
39   rla
40   adc hl,hl
41   ld de,(YPOS)
42   add hl,de
43   ld (IMAG),hl
44   call ABSVAL
45   ex de,hl
46   ld hl,(REAL)
47   call ABSVAL
48   add hl,de
49   ld a,h
50   cp 46        ; 46 ? 2 x √ 2 << 4
51   pop bc
52   jr nc,ESCAPE
53   djnz ITER
54   pop de
55   call PLOT
56   db 254       ; trick to skip next instruction
57 ESCAPE:
58   pop de
59   dec e
60   jr nz,YLOOP
61   dec d
62   jr nz,XLOOP
63   ret
65 FIXMUL:        ; hl = hl x de >> 24
66   call MULT16BY16
67   ld a,b
68   ld b,4
69 FMSHIFT:
70   rla
71   adc hl,hl
72   djnz FMSHIFT 
73   ret
75 SCALE:         ; bc = (hl + e) x zoom
76   ld d,0
77   add hl,de
78   ld de,48     ; zoom
80 MULT16BY16:    ; hl:bc (signed 32 bit) = hl x de
81   xor a
82   call ABSVAL
83   ex de,hl
84   call ABSVAL
85   push af
86   ld c,h
87   ld a,l
88   call MULT8BY16
89   ld b,a
90   ld a,c
91   ld c,h
92   push bc
93   ld c,l
94   call MULT8BY16
95   pop de
96   add hl,de
97   adc a,b
98   ld b,l
99   ld l,h
100   ld h,a
101   pop af
102   rra
103   ret nc
104   ex de,hl
105   xor a
106   ld h,a
107   ld l,a
108   sbc hl,bc
109   ld b,h
110   ld c,l
111   ld h,a
112   ld l,a
113   sbc hl,de
114   ret
116 MULT8BY16:     ; returns a:hl (24 bit) = a x de
117   ld hl,0
118   ld b,8
119 M816LOOP:
120   add hl,hl
121   rla
122   jr nc,M816SKIP
123   add hl,de
124   adc a,0
125 M816SKIP:
126   djnz M816LOOP
127   ret
129 PLOT:          ; plot d = x-axis, e = y-axis
130   ld a,7
131   and d
132   ld b,a
133   inc b
134   ld a,e
135   rra
136   scf
137   rra
138   or a
139   rra
140   ld l,a
141   xor e
142   and 248
143   xor e
144   ld h,a
145   ld a,d
146   xor l
147   and 7
148   xor d
149   rrca
150   rrca
151   rrca
152   ld l,a
153   ld a,1
154 PLOTBIT:
155   rrca
156   djnz PLOTBIT
157   or (hl)
158   ld (hl),a
159   ret
161 ABSVAL:        ; returns hl = |hl| and increments
162   bit 7,h      ; a if the sign bit changed
163   ret z
164   ld b,h
165   ld c,l
166   ld hl,0
167   or a
168   sbc hl,bc
169   inc a
170   ret
172 XPOS:dw 0
173 YPOS:dw 0
174 REAL:dw 0
175 IMAG:dw 0