; fractale ; Généré le Wed, 31 Jul 2013 09:52:10 GMT ; par http://yasep.org/ ; yasep/ASM/YASMed.js version GZ-2013/01/06 ; Dump of the substitution table : .subst xpreuve 496 .subst mandel 368 .subst xc 393212 .subst yc 393208 .subst xd 4 .subst xf 8 .subst yd 12 .subst yf 16 .subst inc 20 .subst mult 54 .subst smul 288 .subst dessin 372 .subst preuve 380 ; Les lignes précédentes ne seront pas sauvées. ;;;;;;;;;;;;;;; end auto header ;;;;;;;;;;;;;;; ; Fractal : Mandelbrot set v0.4 ; (C) 2013-07-31 by Jean-Christophe Haessig .name fractale .profile YASEP32 .subst xpreuve 496 .subst mandel 368 .subst xc 393212 .subst yc 393208 ;saute les données MOV 24 PC ;coordonnées début et fin pour le ;dessin. On utilise des valeurs ;multipliées par 2^14 pour émuler ;un nombre flottant sur un entier ;32 bits . xd DW -34284;x_deb=-2.1 * 2^14 (16384) . xf DW 9830;x_fin=0.6 * 2^14 . yd DW -19661;y_deb=-1.2 * 2^14 . yf DW 19661;y_fin=1.2 * 2^14 ;la largeur du dessin est de 2.7 ;et la hauteur de 2.4. Pour une ;image de 256 pixels de large on ;incrémente de 173 à chaque pixel. ;Les valeurs début et fin ont été ;ajustées pour tomber juste. . inc DW 173 ;On initalise une pile en utilisant ;la fin de la mémoire graphique ;(le dessin étant plus large que ;haut, il reste un peu de place pour ;ça). Le pointeur du sommet est A5 ;On commence par placer les deux ;valeurs courantes de x et y au bas ;de la pile, comme une variable ;locale MOV yc A5 ADD -4 A5 ;récupération des paramètres MOV xd A1 MOV yd A2 MOV xc A4 MOV D1 D4 ;x courant=début MOV yc A4 MOV D2 D4 ;y courant=début ;saute les fonctions MOV mandel R5 MOV R5 PC ;Multiplication 32bits ;R1xR2->R3-R2 . mult ;sauvegarde une partie du ;contexte dans la pile de ;manière à pouvoir réutiliser ;les valeurs ADD -4 A5 MOV A2 D5 ADD -4 A5 MOV R5 D5 ADD -4 A5 A2 MOV R1 D2 ADD -4 A2 A3 MOV R2 D3 ADD -4 A3 A4 ADD -4 A4 A5 ;multiplie les 2 demi-mots ;de poids faible EZB 1 R1 R5 MUL8H R5 R2 R5 ;2 octets pds fort MUL8H R1 R2 R3 ;croisé MUL8H R2 R1 R4 ;croisé, autre sens MUL8L R2 R1 R1 ;2 octets pds faible ADD R4 R3;croisés ont le même poids SHL 264 R3 ;poids moyen SHL 16 R5 ;poids fort ADD R1 R3 ;poids faible ADD R3 R5 D4;resultat temporaire ;croise les demi-mots EZH 2 D2 R1 EZB 1 R1 R5 ;rebelote sur les octets MUL8H R5 R2 R5 MUL8H R1 R2 R3 MUL8H R2 R1 R4 MUL8L R2 R1 R1 ADD R4 R3 SHL 264 R3 SHL 16 R5 ADD R1 R3 ADD R3 R5 D5 ;croise dans l'autre sens EZH 0 D2 R1 EZH 2 D3 R2 EZB 1 R1 R5 MUL8H R5 R2 R5 MUL8H R1 R2 R3 MUL8H R2 R1 R4 MUL8L R2 R1 R1 ADD R4 R3 SHL 264 R3 SHL 16 R5 ADD R1 R3 ADD R3 R5 ADD R5 D5 R4 ;retenue potentielle ;il y a 16 bits pour le mot de ;poids faible et 16 bits pour le ;mot de poids fort : répartir SHR 16 R4 R3 SHL 16 R4 MOV 10000h R5 OR R5 R3 CARRY ;Récupère la retenue ADD R4 D4 ADD 1 R3 CARRY MOV R3 D5 ;enfin les demi-mots de poids fort EZH 2 D2 R1 EZB 1 R1 R5 MUL8H R5 R2 R5 MUL8H R1 R2 R3 MUL8H R2 R1 R4 MUL8L R2 R1 R1 ADD R4 R3 SHL 264 R3 SHL 16 R5 ADD R1 R3 ADD R3 R5 ADD R5 D5 ;on met le résultat au bon endroit MOV D5 R3 MOV D4 R2 ;restaure le contexte ADD 4 A2 A5 MOV D5 R5 ADD 4 A5 MOV D2 R1 MOV D5 A2 ADD 4 A5 MOV D5 PC ;retour (1/2) ;Fonction de préparation à la ;multiplication et post-traitement ;R1xR2->R2 . smul ;sauve le contexte ADD -4 A5 MOV R3 D5 ADD -4 A5 MOV R4 D5 ADD -4 A5 MOV R5 D5 ;la multiplication ne marche ;pas sur les négatifs MOV 0 R5 ;sauvegarde le signe MOV 1 R5 MSB1 R1 ;si négatif, R1=-R1 NEG R1 MSB1 R1 ;LSB R5:signe du résultat ADD 1 R5 MSB1 R2 NEG R2 MSB1 R2 ;prépare la pile pour appel ADD -4 A5 ;(empile adresse de retour) CALL mult D5 ;retour (2/2:il faut dépiler) ADD 4 A5 ;la multiplication a généré ;28 bits après la virgule ;on jette les 14 bits de précision SHR 270 R2 ;on récupère les poids forts ROR 270 R3 MOV FFFFh R4 MOVH 3h R4 ANDN R3 R4 R1 OR R1 R2 ;R1 doit être à 0 sinon, on a ;une valeur trop grande pour un ;registre. ;On a 18 bits pour la partie ;entière et on attend normalement ;des petites valeurs. ;Pour l'instant on ne tient pas ;compte d'un dépassement AND R3 R4 R1 ;On ajuste le signe NEG R2 LSB1 R5 ;restaure le contexte ;et revient MOV D5 R5 ADD 4 A5 MOV D5 R4 ADD 4 A5 MOV D5 R3 ADD 4 A5 MOV D5 PC ;************************** ; Programme principal . mandel ;premier pixel MOV 20000h A1 ;boucle dessin . dessin ;on travaille sur des complexes ;qui sont représentés par deux ;valeurs : MOV 0 R3; zr : partie réelle MOV 0 R4; zi : imaginaire ;on calcule Zn+1=Zn²+C et ;on cherche si |Zn|->inf. On ;fait 50 itérations max et ;si |Zn|>2 on sait qu'il ;ira à l'infini ;C=l'équivalent complexe du ;pixel courant (x,y) MOV 50 R5 ;debut bcl preuve . preuve ;zr² MOV R3 R1 MOV R3 R2 ADD -4 A5 CALL smul D5 ;ADD 4 A5 ;on devrait dépiler ;ADD -4 A5 ;mais pas besoin MOV R2 D5 ;met de côté ;zi² MOV R4 R1 MOV R4 R2 ADD -4 A5 CALL smul D5 ADD 4 A5 MOV D5 R1 ;récupère zr² ADD 4 A5 SUB R1 R2; (i²=-1) MOV R3 R1;sauvegarde zr MOV xc A2 ;x courant ADD D2 R2 R3; maj de zr SHL 1 R1 ; 2*zr MOV R4 R2 ADD -4 A5 CALL smul D5 ;...*zi ADD 4 A5 MOV yc A2 ;y courant ADD D2 R2 R4; maj zi ;zr² MOV R3 R1 MOV R3 R2 ADD -4 A5 CALL smul D5 ;ADD 4 A5 ;ADD -4 A5 MOV R2 D5 ;zi² MOV R4 R1 MOV R4 R2 ADD -4 A5 CALL smul D5 ADD 4 A5 MOV D5 R1 ADD 4 A5 ADD R1 R2; zr^2+zi^2 MOV 4 R1 SHL 270 R1 ; 4*2^14 SUB R1 R2 ;compare à 4 MOV xpreuve R1 ;sort si |z|>2 MOV R1 PC MSB1 R2 ADD -1 R5 MOV preuve R1 ;suite bcl preuve MOV R1 PC NZ R5 ;fin de la preuve . xpreuve ;R5 contient le nombre ;d'itérations non effectuées ;(0 : Z est dans l'ensemble ;pour ce C). On utilise ce ;nombre pour choisir une ;couleur SHL 2 R5 R1 ;R5*4 calcul couleur ADD R1 R5 ;R5*5 (max.250) IB 0 R5 R1 ;R IB 1 R5 R1 ;V IB 2 R5 R1 ;B MOV R1 D1 ;dessine le pixel ADD 4 A1 ;pixel suivant MOV xc A2; x courant MOV xf A3 ;fin x SUB D3 D2 R1 MOV 24 R5 ADD R5 PC MSB0 R1 MOV xd A4 ;debut x MOV D4 D2 ;repasse x au début ;et on incrémente y MOV inc A4; incrément MOV yc A2; y courant ADD D4 D2 MOV dessin R5 MOV R5 PC;reboucle ;si x n'est pas au bout MOV inc A4 ;incrémente ADD D4 D2 ;check final si y est au bout MOV yc A2; y courant MOV yf A3 ;fin y SUB D3 D2 R1 MOV dessin R5 MOV R5 PC MSB0 R1 halt