CPC Rulez
https://cpcrulez.fr/forum/

Les fractales de mandelbrot
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=4627
Page 1 sur 1

Auteur :  Demoniak [ 13 Sep 2011, 14:57 ]
Sujet du message :  Les fractales de mandelbrot

Voici un source assembleur utilisant des entiers. Pas très optimisé mais quand même plus rapide que la version avec des variables en virgule flottante, il utilise le firmware pour tracer les points.
Code :
        ORG     #A000

        XOR     A
        CALL    #BC0E
maxy:
        LD      HL,12000                ; borne maxy pour le tracé
miny:
        LD      DE,-12000               ; borne miny pour le tracé
        LD      (deply+1),DE
        AND     A
        SBC     HL,DE
        LD      DE,200
        CALL    Div
        LD      (haut+1),HL             ; haut = ( maxy - miny ) / 200
maxx:
        LD      HL,9000                 ; borne maxx pour le tracé
minx:
        LD      DE,-14000               ; borne minx pour le tracé
        AND     A
        SBC     HL,DE
        LD      DE,160
        CALL    Div
        LD      (larg+1),HL             ; larg = ( maxx - minx ) / 160
        LD      HL,0
        LD      (y+1),HL
BclY:
        LD      A,(y+1)
        CP      200                     ; 200 pixels en hauteur (*2)
        RET     NC
        INC     A
        LD      (y+1),A
        LD      HL,(minx+1)
        LD      (deplx+1),HL            ; deplx = minx
        LD      HL,0
        LD      (x+1),HL                ; x = 0
        LD      HL,(deply+1)
haut:
        LD      DE,0
        ADD     HL,DE
        LD      (deply+1),HL            ; haut = haut + deply
BclX:
        LD      A,(x+1)
        CP      160                     ; 160 pixels en largeur (*4)
        JR      NC,BclY
        INC     A
        LD      (x+1),A
        XOR     A
        LD      (pen+1),A
        LD      HL,(deply+1)
        LD      (iz+1),HL               ; iz = deply
        LD      HL,(deplx+1)
        LD      (rz+1),HL               ; rz = deplx
larg:
        LD      DE,0
        ADD     HL,DE
        LD      (deplx+1),HL            ; deplx = dexpl + larg
BclWhile:
        LD      HL,(iz+1)
        LD      DE,-14000
        LD      A,D
        SUB     H
        JP      P,pen                   ; break si iz <= -14000
        LD      A,(pen+1)
        CP      15
        JR      NC,pen                  ; break si pen >= 15
        INC     A
        LD      (pen+1),A               ; pen = pen + 1
iz:
        LD      HL,0
        LD      A,H
        RLCA
        ADD     HL,HL
        SBC     A,A
        ADD     HL,HL
        RLA
        LD      L,H
        LD      H,A
        LD      (i2+1),HL               ; i = iz >> 6
rz:
        LD      HL,0
        LD      A,H
        RLCA
        ADD     HL,HL
        SBC     A,A
        ADD     HL,HL
        RLA
        LD      C,H
        LD      B,A
        PUSH    BC                      ; r = rz >> 6
        LD      D,B
        LD      E,C
        CALL    Mul
        PUSH    HL                      ; sauvegarde r * r
i2:
        LD      BC,0
        LD      D,B
        LD      E,C
        CALL    Mul                     ; hl = i * i
        POP     DE                      ; récup r * r
        EX      DE,HL
        SBC     HL,DE
        SRA     H
        RR      L
deplx:
        LD      DE,0
        ADD     HL,DE
        LD      (rz+1),HL               ; rz = ( ( ( r * r ) - ( i * i ) ) >> 1 ) + deplx
        POP     BC                      ; récup r
        LD      DE,(i2+1)
        CALL    Mul
deply:
        LD      DE,0
        ADD     HL,DE
        LD      (iz+1),HL               ; iz = ( i * r ) + deply
        JR      BclWhile
pen:
        LD      A,0
        CALL    #BBDE                   ; Set pen
x:
        LD      HL,0
        ADD     HL,HL
        ADD     HL,HL
        EX      DE,HL
y:
        LD      HL,0
        ADD     HL,HL
        CALL    #BBEA                   ; Plot x,y
        JP      BclX
;
; Division 16 bits / 16 bits : HL = HL / DE
;
Div:
        LD      A,H
        LD      C,L
        LD      HL,0
        LD      B,16
Div1:
        RL      C
        RLA
        ADC     HL,HL
        SBC     HL,DE
        JR      NC,Div2
        ADD     HL,DE
Div2:
        CCF
        DJNZ    Div1
        EX      DE,HL
        RL      C
        RLA
        LD      H,A
        LD      L,C
        RET
;
; Multiplication 16 bits * 16 bits : HL = BC * DE
;
Mul:
        LD      HL,0
Mul1:
        LD      A,C
        RRCA
        JR      NC,Mul2
        ADD     HL,DE
Mul2:
        XOR     A
        LD      A,B
        RRA
        LD      B,A
        LD      A,C
        RRA
        LD      C,A
        OR      B
        RET     Z
        XOR     A
        LD      A,E
        RLA
        LD      E,A
        LD      A,D
        RLA
        LD      D,A
        OR      E
        RET     Z
        JR      Mul1

Page 1 sur 1 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/