Zitat von MikeLetztenendes war aber genau diese Schleife dann der Knackpunkt und genau die hatte ich dann später mal in Maschinencode übersetzt, wo dann die Arithmetikroutinen des Interpreters direkt aufgerufen wurden. In der Folge wurde dann diese Schleife um den Faktor 3 beschleunigt, zusammen mit dem restlichen Programm lag dann beim Ausgangsbild die Zeit bei ca. 90 Minuten. Ein anderer Koordinatensatz (mit 254 als maximale Rechentiefe) wurde z.B. von 2360 auf 840 Minuten beschleunigt.
Zitat von JeeKAuch beachtlich. So ein Compiler ist nicht zu verachten.
Hmm, nein, nix Compiler. Liebevoll selbstgeschriebener und dann assemblierter Maschinencode:
DIM code 256
I=3:N=5:X=704:Y=X+5:X2=X+10:Y2=X+15:R=X+20:J=X+25
FOR pass=4 TO 7 STEP 3
P%=&033C:O%=code
[OPT pass
.Mandel
JSR &AEFD:LDA #0:STA &0D:JSR &AD8A
LDX # R MOD 256:LDY # R DIV 256:JSR &BBD4
LDX # X MOD 256:LDY # X DIV 256:JSR &BBD4
JSR &AEFD:LDA #0:STA &0D:JSR &AD8A
LDX # J MOD 256:LDY # J DIV 256:JSR &BBD4
LDX # Y MOD 256:LDY # Y DIV 256:JSR &BBD4
LDA #1:STA I:LDA #0:STA I+1
LDA # X MOD 256:LDY # X DIV 256:JSR &BBA2
.Mandel_00
LDA # X MOD 256:LDY # X DIV 256:JSR &BA28
LDX #X2 MOD 256:LDY #X2 DIV 256:JSR &BBD4
LDA # Y MOD 256:LDY # Y DIV 256:JSR &BBA2
LDA # Y MOD 256:LDY # Y DIV 256:JSR &BA28
LDX #Y2 MOD 256:LDY #Y2 DIV 256:JSR &BBD4
LDA #X2 MOD 256:LDY #X2 DIV 256:JSR &B867
LDA &61:CMP #&83:BCS Mandel_02
LDA # X MOD 256:LDY # X DIV 256:JSR &BBA2
LDA # Y MOD 256:LDY # Y DIV 256:JSR &BA28
INC &61
LDA # J MOD 256:LDY # J DIV 256:JSR &B867
LDX # Y MOD 256:LDY # Y DIV 256:JSR &BBD4
LDA #Y2 MOD 256:LDY #Y2 DIV 256:JSR &BBA2
LDA #X2 MOD 256:LDY #X2 DIV 256:JSR &B850
LDA # R MOD 256:LDY # R DIV 256:JSR &B867
LDX # X MOD 256:LDY # X DIV 256:JSR &BBD4
INC I:BNE Mandel_01:INC I+1
.Mandel_01
SEC:LDA N:SBC I:LDA N+1:SBC I+1:BCS Mandel_00
.Mandel_02
RTS
]
NEXT
Alles anzeigen
Das ist bereits für den C64 und kam dann in der portierten Fassung des Mandelbrotgenerators in einem anderen Thread (Bitte melde dich an, um diesen Link zu sehen.) auch zum Einsatz. ![]()
Außer daß I und N jetzt als 16 Bit unsigned Integer "deklariert" sind, macht diese Routine exakt dasselbe wie zuvor Zeile 17 in dem Programm - die Parameterübergabe für R und J übernehmen die beiden Routinen bei $AEFD (Check für Komma) und $AD8A (Ausdruck auswerten und nach FAC), so daß man die Routine mit SYS828,R(...),J(...) aufrufen und die Anzahl der tatsächlich stattgehabten Iterationen danach mit 'PEEK(3)+256*PEEK(4)' herausholen kann.
P.S. Nicht wundern über die &-Zeichen bei den Hex-Konstanten. Das ist der Inline-Assembler von BBC BASIC. ![]()