Index du forum




Un petit coup de main... Vous pouvez nous aider à mettre ce site à jour: n'hésitez pas à me contacter !!!

* Connexion   * Inscription

* FAQ
Nous sommes actuellement le 28 Nov 2025, 01:39

Index du forum » Z80 Coding

Le fuseau horaire est UTC+1 heure


Les fractales de mandelbrot

Modérateur: poulette73



Publier un nouveau sujet Répondre au sujet  Page 1 sur 1
 [ 1 message ] 
  Aperçu avant impression Sujet précédent | Sujet suivant 
Auteur Message
Demoniak
 Sujet du message : Les fractales de mandelbrot
Message Publié : 13 Sep 2011, 14:57 
Hors-ligne
VIP
VIP

Inscription : 15 Oct 2009, 18:07
Message(s) : 236
Localisation : Dunkerque
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

_________________
http://demoniak-contrib.forumactif.com/


Haut
 Profil  
 
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  Page 1 sur 1
 [ 1 message ] 

Index du forum » Z80 Coding

Le fuseau horaire est UTC+1 heure


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 63 invité(s)


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas insérer de pièces jointes dans ce forum

Aller vers :  
cron
Powered by phpBB® Forum Software © phpBB Group
Traduit en français par Maël Soucaze.