1 | ' Berechnung eines Punktes der Mandelbrotmenge
|
2 | ' von Dietmar Harlos am 1. Juli 2006
|
3 | ' die Anzahl der benoetigten Iterationen wird in iter zurueckgeliefert
|
4 |
|
5 | PROC mandel INLASM
|
6 |
|
7 | ! lda REc '-128..32 ' RE(c) muss in der Aufloesung reduziert
|
8 | ! asra ' werden, damit es in den folgenden Berech-
|
9 | ! adc #0 ' nungen nicht zu einem Ueberlauf kommt.
|
10 | ! sta REc_dz '-64..16 ' Dabei wird gerundet.
|
11 | ! sta REz
|
12 |
|
13 | ! lda IMc '-72..72 ' IM(c) ebenso reduzieren. Die Zahlen sind
|
14 | ! asra ' jetzt mit dem Faktor 32 skaliert, was
|
15 | ! adc #0 ' dem Linksshiften um 5 Stellen entspricht.
|
16 | ! sta IMc_dz '-36..36 ' -64..16 -> -64/32..16/32 -> -2.0..0.5
|
17 | ! sta IMz
|
18 |
|
19 | ! clr iter ' Anzahl der Iterationen festhalten
|
20 | #mandel_1
|
21 | ! lda REz '-64..63 ' RE(z)^2 berechnen und festhalten, da es
|
22 | ! tax ' unten noch einmal benoetigt wird.
|
23 | ! bsr imul
|
24 | ! asrx
|
25 | ! rora
|
26 | ! adc #0
|
27 | ! sta REzQ '0..128
|
28 |
|
29 | ! lda IMz '-64..63 ' IM(z)^2 berechnen und festhalten, da es
|
30 | ! tax ' unten noch einmal benoetigt wird.
|
31 | ! bsr imul
|
32 | ! asrx
|
33 | ! rora
|
34 | ! adc #0
|
35 | ! sta IMzQ '0..128
|
36 |
|
37 | ! add REzQ ' Abfrage RE(z)^2+IM(z)^2 >= 128 (= 4.0)
|
38 | ! blt mandel_2 '(N XOR V)=1 ' Schleife beenden, wenn Betrag von z >= 2.0
|
39 |
|
40 | ! inc iter ' Iterationszaehler um eins inkrementieren
|
41 | ! lda #14 ' und auf maximale Anzahl der Iterationen
|
42 | ! cbeq iter,mandel_2 ' ueberpruefen
|
43 |
|
44 | ! lda REz '-64..63 ' IM(z) = 2*RE(z)*IM(z) + IM(c)
|
45 | ! ldx IMz '-64..63
|
46 | ! bsr imul '-4032..4096 -> x:a= $ff:04..$01:$00
|
47 | ! adc IMc_dz '-36..36 -/+ 1
|
48 | ! bcc mandel_3
|
49 | ! incx ' Die Multiplikation mit 2 liefert ein
|
50 | #mandel_3 ' 16-Bit-Ergebnis, deshalb muss auch die
|
51 | ! brclr #7,IMc_dz,mandel_4 ' Addition in 16-Bit durchgefuehrt werden.
|
52 | ! decx
|
53 | #mandel_4
|
54 | ! sta IMz
|
55 |
|
56 | ! pushx ' Schleife verlassen, falls das 16-Bit-
|
57 | ! poph ' Ergebnis zu gross oder zu klein ist.
|
58 | ! tax ' Wenn IM(z) z.B. -65, dann waere IM(z)^2
|
59 | ! cmphx #63 ' gleich 132. Die Schleife wuerde also nach-
|
60 | ! bgt mandel_2 ' folgend beim "blt mandel_2" verlassen.
|
61 | ! cmphx #-64
|
62 | ! blt mandel_2
|
63 |
|
64 | ! lda REzQ '0...126 ' RE(z) = RE(z)^2-IM(z)^2 + RE(c)
|
65 | ! sub IMzQ '0...126 -> -126..126
|
66 | ! add REc_dz '-64..15
|
67 | ! tax ' Schleife verlassen, falls bei der Addition
|
68 | ! tpa ' ein Ueberlauf im 2-er-Komplement auftrat
|
69 | ! tsta
|
70 | ! bmi mandel_2 'V - Overflow Flag - A7 & M7 & ~R7 | ~A7 & ~M7 & R7
|
71 | ! stx REz
|
72 |
|
73 | ! cmpx #63 ' Schleife verlassen, falls das Ergebnis
|
74 | ! bgt mandel_2 ' zu gross oder zu klein ist. Begruendung
|
75 | ! cmpx #-64 ' siehe oben.
|
76 | ! bge mandel_1
|
77 |
|
78 | #mandel_2
|
79 | ! rts ' Ruecksprung nach BASIC
|
80 |
|
81 |
|
82 | ' Vorzeichenbehaftete Multiplikation im mit 32 skalierten 8-Bit-Fixkommaformat
|
83 | ' von Dietmar Harlos am 1. Juli 2006
|
84 |
|
85 | #imul
|
86 | ! clr OSTEMP
|
87 | ! tsta ' Zum Verstaendnis, Multiplikation 1.75 mal 1.5:
|
88 | ! bpl imul_1 ' Die Zahlen sind skaliert: 1.75*32=56, 1.5*32=48
|
89 | ! inc OSTEMP ' Multiplikation liefert: 1.75*1.5*32*32=2688
|
90 | ! nega ' Zur Anpassung an die Skalierung wird durch 32
|
91 | #imul_1 ' geteilt, also 5-mal nach rechts geshiftet.
|
92 | ! tstx ' Das Ergebnis 2688/32=84 ist somit 84/32=2.625.
|
93 | ! bpl imul_2
|
94 | ! inc OSTEMP
|
95 | ! negx ' Maximaler Rueckgabewert (Ergebnis):
|
96 | #imul_2 ' -64*-64= 4096/2^4= 256 -> x:a = $01:$00
|
97 | ! mul ' -64* 63=-4032/2^4=-252 -> x:a = $ff:$04
|
98 | #imul_4
|
99 | ! brclr #0,OSTEMP,imul_3
|
100 | ! comx
|
101 | ! nega
|
102 | ! bne imul_3
|
103 | ! incx
|
104 | #imul_3
|
105 | ! asrx
|
106 | ! rora ' Eigentlich sind 5 Schiebe- und Rotierbefehle
|
107 | ! asrx ' notwendig, aber im Hauptprogramm muss an
|
108 | ! rora ' einer Stelle das Ergebnis der Multiplikation
|
109 | ! asrx ' mit zwei multipliziert werden. Deshalb wird
|
110 | ! rora ' das fuenfte Schieben inklusive Runden bei
|
111 | ! asrx ' Bedarf im Hauptprogramm durchgefuehrt.
|
112 | ! rora
|
113 | ! rts
|
114 |
|
115 | END PROC
|