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