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
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 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