Logicielsmoto.com http://www.logicielsmoto.com/phpBB/ |
|
Tracé de cercles http://www.logicielsmoto.com/phpBB/viewtopic.php?f=3&t=595 |
Page 1 sur 3 |
Auteur: | Samuel Devulder [ 22 Mar 2019, 22:15 ] |
Sujet du message: | Tracé de cercles |
Pour ceux que ca intéresse, j'ai trouvé une vidéo (hélas pas mal bruitée) présentée à la Forever-Party qui décrit différents algorithmes de plus en plus efficaces pour tracer des cercles sur ZX, mais cela s'adapte sans soucis à notre plateforme. |
Auteur: | Prehisto [ 23 Mar 2019, 23:10 ] |
Sujet du message: | Re: Tracé de cercles |
C'est absolument gé-nial! Un algorithme qui permet de tracer un cercle avec seulement une division par 2 (facile!), des additions, des soustractions et des comparaisons! Aucune multiplication et aucun cosinus! Et il trace 8 points d'un coup avec un seul calcul! Ça doit être effectivement très rapide. Si j'avais connu cet algorithme plus tôt, j'aurais pu constituer une table de cosinus beaucoup plus rapidement pour Bloddy Run (très long avec l'Extramoniteur). Ça me donne envie de faire des cercles... EDIT: Remarque que ça n'est pas très éloigné (dans une mesure plus simple) du traçage de ligne par le Moniteur, avec des incréments et des erreurs de pixels. Mais ça reste plus rapide que l'Extramoniteur, qui trace, lui, un cercle avec seulement 4 graines simultanées et un traçage chevauchant (donc gras), ce qui est moins précis. |
Auteur: | PulkoMandy [ 25 Mar 2019, 08:54 ] |
Sujet du message: | Re: Tracé de cercles |
A la fin il propose un patch de la ROM du spectrum pour avoir des tracés de cercles plus rapides. Comme l'algo est tout petit, c'est facile de remplacer l'existant. On fait la même chose sur Thomson, alors? |
Auteur: | Prehisto [ 25 Mar 2019, 09:58 ] |
Sujet du message: | Re: Tracé de cercles |
C'est vrai que ce serait tentant, mais en l'état, l'algorithme ne gère pas le tracé d'ellipse. À vue de nez, une ellipse étant en quelque sorte un cercle dans un cercle, il faudrait deux X, deux Y et deux Z. Et un peu plus de calculs. Mais c'est toujours délicat d'envisager un changement dans la ROM. Certains programmeurs ont littéralement pioché dedans ou sont allés brancher directement à certaines adresses. Ça dépend à quel point ils la connaissaient. Certains programmes risquent de boguer. EDIT: en fait, c'est plutôt le genre de routine qui convient pour des démos ou des jeux |
Auteur: | Prehisto [ 25 Mar 2019, 10:21 ] |
Sujet du message: | Re: Tracé de cercles |
Voilà un programme qui fonctionne. Il fait la même chose que pour la démonstration vidéo. Mais ce programme utilise la routine Moniteur pour le tracé de point. Si on sait quel genre de points on doit tracer, elle peut aussi être très optimisée. Code: debut equ *
* Initialise l'écran ldx #mess bsr puts * Initialise le tracé clr >$6041 ldb #$06 stb >$6038 * Trace le cercle ldd #85 ;Rayon ldx #128 ;Centre X ldy #87 ;Centre Y bsr circle * Attend l'appui d'une touche key0 jsr >$e806 tstb bne key0 key1 jsr >$e806 tstb beq key1 swi * Affiche un message puts0 jsr >$e803 puts ldb ,x+ bne puts0 rts * Initialisation de l'écran mess fcb $1f,$20,$20 fcb $1f,$12,$14 fcb $1b,$47 fcb $1b,$50 fcb $1b,$60 fcb $0c fcb $14 fcb 0 xc fdb 0 xr fdb 0 yc fdb 0 yr fdb 0 z fdb 0 circle pshs a,b,x,y std >xr stx >xc sty >yc * Y=0 clra clrb std >yr * Z = INT(X/2) ldd >xr lsra rorb std >z * (XCENTER+X,YCENTER+Y) circl0 ldd >xc addd >xr tfr d,x ldd >yc addd >yr tfr d,y jsr >$e80f * (XCENTER+X,YCENTER-Y) ldd >yc subd >yr tfr d,y jsr >$e80f * (XCENTER-X,YCENTER-Y) ldd >xc subd >xr tfr d,x jsr >$e80f * (XCENTER-X,YCENTER+Y) ldd >yc addd >yr tfr d,y jsr >$e80f * (XCENTER+Y,YCENTER+X) ldd >xc addd >yr tfr d,x ldd >yc addd >xr tfr d,y jsr >$e80f * (XCENTER+Y,YCENTER-X) ldd >yc subd >xr tfr d,y jsr >$e80f * (XCENTER-Y,YCENTER-X) ldd >xc subd >yr tfr d,x jsr >$e80f * (XCENTER-Y,YCENTER+X) ldd >yc addd >xr tfr d,y jsr >$e80f * Y = Y+1 ldd >yr addd #1 std >yr * Z=Z-Y ldd >z subd >yr std >z * IF Z<0 THEN Z=Z+X:X=X-1 bcc circl1 addd >xr std >z ldd >xr subd #1 std >xr * IF X>=Y THEN GOTO 30 circl1 ldd >xr subd >yr lbcc circl0 puls a,b,x,y,pc end |
Auteur: | Prehisto [ 25 Mar 2019, 10:39 ] |
Sujet du message: | Re: Tracé de cercles |
La même chose, mais avec une routine personnalisée de tracé de point. Ça va plus vite que l'ExtraMoniteur, mais ça n'est pas encore instantané. EDIT: le cercle est entièrement tracé au pire au bout de (332+8×113)×61=75396 cycles, soit quand même presque 4 vbl. Et sans test de bord, pour l'instant Code: debut equ *
* Initialise l'écran ldx #mess bsr puts * Initialise le tracé clr >$6041 ldb #$06 stb >$6038 * Trace le cercle ldd #85 ;Rayon ldx #128 ;Centre X ldy #87 ;Centre Y bsr circle * Attend l'appui d'une touche key0 jsr >$e806 tstb bne key0 key1 jsr >$e806 tstb beq key1 swi * Affiche un message puts0 jsr >$e803 puts ldb ,x+ bne puts0 rts * Initialisation de l'écran mess fcb $1f,$20,$20 fcb $1f,$12,$14 fcb $1b,$47 fcb $1b,$50 fcb $1b,$60 fcb $0c fcb $14 fcb 0 xc fdb 0 xr fdb 0 yc fdb 0 yr fdb 0 z fdb 0 circle pshs a,b,x,y std >xr stx >xc sty >yc * Y=0 clra clrb std >yr * Z = INT(X/2) ldd >xr lsra rorb std >z * (XCENTER+X,YCENTER+Y) circl0 ldd >xc addd >xr tfr d,x ldd >yc addd >yr tfr d,y bsr point * (XCENTER+X,YCENTER-Y) ldd >yc subd >yr tfr d,y bsr point * (XCENTER-X,YCENTER-Y) ldd >xc subd >xr tfr d,x bsr point * (XCENTER-X,YCENTER+Y) ldd >yc addd >yr tfr d,y bsr point * (XCENTER+Y,YCENTER+X) ldd >xc addd >yr tfr d,x ldd >yc addd >xr tfr d,y bsr point * (XCENTER+Y,YCENTER-X) ldd >yc subd >xr tfr d,y bsr point * (XCENTER-Y,YCENTER-X) ldd >xc subd >yr tfr d,x bsr point * (XCENTER-Y,YCENTER+X) ldd >yc addd >xr tfr d,y bsr point * Y = Y+1 ldd >yr addd #1 std >yr * Z=Z-Y ldd >z subd >yr std >z * IF Z<0 THEN Z=Z+X:X=X-1 bcc circl1 addd >xr std >z ldd >xr subd #1 std >xr * IF X>=Y THEN GOTO 30 circl1 ldd >xr subd >yr lbcc circl0 puls a,b,x,y,pc * Trace un point point pshs x,y ! ldd 2,s ! aslb ! rola ! aslb ! rola ! addd 2,s ! Y x 40 aslb ! rola ! aslb ! rola ! aslb ! rola ! ldx #$4000 ! Calcule leax d,x ! pointeur ldd ,s ! lsra ! rorb ! lsra ! X / 8 rorb ! lsra ! rorb ! leax d,x Ajuste pointeur ldd ,s ! andb #$07 ! Lit bit ldy #bittab ! de point ldb b,y ! orb ,x ! Trace stb ,x ! le point puls x,y,pc ! * Table des bits pour tracé de point bittab fcb $80,$40,$20,$10 fcb $08,$04,$02,$01 end |
Auteur: | Prehisto [ 25 Mar 2019, 11:08 ] |
Sujet du message: | Re: Tracé de cercles |
Avec le test de bords, ça dépasse un peu les 4 vbls (82716 cycles): Code: * Trace un point
point pshs x,y ! cmpx #320 ! bhs point0 ! Sort si bord cmpy #200 ! d'écran dépassé bhs point0 ! ldd 2,s ! aslb ! rola ! aslb ! rola ! addd 2,s ! Y x 40 aslb ! rola ! aslb ! rola ! aslb ! rola ! ldx #$4000 ! Calcule leax d,x ! pointeur ldd ,s ! lsra ! rorb ! lsra ! X / 8 rorb ! lsra ! rorb ! leax d,x Ajuste pointeur ldd ,s ! andb #$07 ! Lit bit ldy #bittab ! de point ldb b,y ! orb ,x ! Trace stb ,x ! le point point0 puls x,y,pc ! |
Auteur: | Prehisto [ 25 Mar 2019, 11:32 ] |
Sujet du message: | Re: Tracé de cercles |
Même en passant tous les registres en adressage direct et allant chercher le pointeur d'écran dans une table plutôt que de le calculer, on reste au-dessus des 3 vbl (66185 cycles). Code: ldx #scrptr
abx abx ldx ,x |
Auteur: | Prehisto [ 25 Mar 2019, 12:02 ] |
Sujet du message: | Re: Tracé de cercles |
Un peu plus de 3 vbl, mais pas loin (62098 cycles). À ce stade, l'un des moyens de passer sous la barre des 3 vbl est de s'affranchir du test de bords pour le traçage des points. Code: MYDP equ *<-8
setdp MYDP xc fdb 0 xr fdb 0 yc fdb 0 yr fdb 0 z fdb 0 debut equ * * Initialise l'écran ldx #mess bsr puts * Initialise le tracé clr >$6041 ldb #$06 stb >$6038 * Initialise la table des pointeurs lda #200 ldx #scrptr ldu #$4000 init0 stu ,x++ leau 40,u deca bne init0 * Trace le cercle ldd #85 ;Rayon ldx #128 ;Centre X ldy #87 ;Centre Y bsr circle * Attend l'appui d'une touche key0 jsr >$e806 tstb bne key0 key1 jsr >$e806 tstb beq key1 swi * Affiche un message puts0 jsr >$e803 puts ldb ,x+ bne puts0 rts * Initialisation de l'écran mess fcb $1f,$20,$20 fcb $1f,$12,$14 fcb $1b,$47 fcb $1b,$50 fcb $1b,$60 fcb $0c fcb $14 fcb 0 circle pshs a,b,dp,x,y std >xr ldb #MYDP tfr b,dp stx <xc sty <yc * Y=0 clra clrb std <yr * Z = INT(X/2) ldd <xr lsra rorb std <z * (XCENTER+X,YCENTER+Y) circl0 ldd <xc addd <xr tfr d,x ldd <yc addd <yr tfr d,y bsr point * (XCENTER+X,YCENTER-Y) ldd <yc subd <yr tfr d,y bsr point * (XCENTER-X,YCENTER-Y) ldd <xc subd <xr tfr d,x bsr point * (XCENTER-X,YCENTER+Y) ldd <yc addd <yr tfr d,y bsr point * (XCENTER+Y,YCENTER+X) ldd <xc addd <yr tfr d,x ldd <yc addd <xr tfr d,y bsr point * (XCENTER+Y,YCENTER-X) ldd <yc subd <xr tfr d,y bsr point * (XCENTER-Y,YCENTER-X) ldd <xc subd <yr tfr d,x bsr point * (XCENTER-Y,YCENTER+X) ldd <yc addd <xr tfr d,y bsr point * Y = Y+1 ldd <yr addd #1 std <yr * Z=Z-Y ldd <z subd <yr std <z * IF Z<0 THEN Z=Z+X:X=X-1 bcc circl1 addd <xr std <z ldd <xr subd #1 std <xr * IF X>=Y THEN GOTO 30 circl1 ldd <xr subd <yr bcc circl0 puls a,b,dp,x,y,pc * Trace un point point pshs x,y ! cmpx #320 ! bhs point0 ! Sort si bord cmpy #200 ! d'écran dépassé bhs point0 ! ldx #scrptr ! ldb 3,s ! abx ! Définit le abx ! pointeur d'écran ldx ,x ! ldd ,s ! lsra ! rorb ! X / 8 lsrb ! lsrb ! abx Ajuste pointeur ldb 1,s ! andb #$07 ! Lit bit ldy #bittab ! de point ldb b,y ! orb ,x ! Trace stb ,x ! le point point0 puls x,y,pc ! * Table des bits pour tracé de point bittab fcb $80,$40,$20,$10 fcb $08,$04,$02,$01 * Table des pointeurs d'écran scrptr rmb 200*2 end |
Auteur: | Samuel Devulder [ 25 Mar 2019, 12:18 ] |
Sujet du message: | Re: Tracé de cercles |
Quelques idées sur le plot: Code: ldx #$4000 ! Calcule coute 3+8=11 cycles alors queleax d,x ! pointeur Code: ADDA #$40 fait la même chose en 8 cycles seulement (et moins d'octets)TFR D,X plus loin Code: ldd ,s ! Comme on sait que X<=320, ca veut dire que après le premier LSRA, on aura toujours A=0, et qu'il ne sert à rien de les faire par la suite. Du coup on a pas besoin d'ajouter D à X, mais uniquement B. Breflsra ! rorb ! lsra ! X / 8 rorb ! lsra ! rorb ! leax d,x Ajuste pointeur Code: ldd ,s ! fait pareil, mais en plus rapide. ([EDIT] ah oui tu l'as vu aussi dans le code ci-dessus)lsra ! rorb ! X/8 lsrb lsrb lsrb abx Ajuste pointeur Enfin pour la mul par 40, comme Y<=200<256, on peut faire ainsi: Code: ldb 3,s ! ([EDIT] mais j'aime assez la table de precalc ci-dessus, qui doit être un peu plus rapide)lda #40 mul Je pense en outre qu'on peut faire en sorte d'avoir en une fois le bitmask et X/40 via un precalc un tout petit peu plus grand (640 octets). L'un dans l'autre pour la routine plot j'aurais ceci perso qui me semble aller très vite (plus vite encore si on décide de stocker dans U le precalc et de trasher X,Y car on accède qu'une seule fois à ces valeurs) Code: * Trace un point
point pshs x,y ! cmpx #320 ! bhs point0 ! Sort si bord cmpy #200 ! d'écran dépassé bhs point0 ! ldb 3,s ! lda #40 ! mul ! D=40*Y adda #$40 ! tfr d,y ! Y = 40*Y + $4000 = ligne video ldd ,s ! lslb ! coord-X*2 rola ! ldx #precalc! ldx plus rapide que ldy ldd d,x ! a=bitmask b=coord-X/40 ora b,y ! b,y deux fois est plus rapide qu'un seul abx sta b,y ! point0 puls x,y,pc ! m_prec macro fcb %10000000,\0 fcb %01000000,\0 fcb %00100000,\0 fcb %00010000,\0 fcb %00001000,\0 fcb %00000100,\0 fcb %00000010,\0 fcb %00000001,\0 endm precalc m_prec 0 m_prec 1 m_prec 2 m_prec 3 ... m_prec 39 |
Auteur: | Fool-DupleX [ 25 Mar 2019, 13:05 ] |
Sujet du message: | Re: Tracé de cercles |
Je me trompe ou c'est juste l'algorithme de Bresenham (https://fr.wikipedia.org/wiki/Algorithme_de_trac%C3%A9_d%27arc_de_cercle_de_Bresenham) ? Adapté à nos contraintes vidéo bien sûr. |
Auteur: | PulkoMandy [ 25 Mar 2019, 13:11 ] |
Sujet du message: | Re: Tracé de cercles |
Il y a d'abord l'algorithme de Bresenham, et ensuite une version optimisée encore plus rapide, si je me trompe pas. Et enfin un algo de calcul de racine carrée très compact et trouvé sur une tablette babylonienne datant d'avant le théorème de Pythagore. |
Auteur: | Samuel Devulder [ 25 Mar 2019, 13:29 ] |
Sujet du message: | Re: Tracé de cercles |
Ca ne correspond pas au Bresenham du wiki qui travaille avec 8x et 8y. En outre Bresenham fait des cercles "empatés" or là ils ne font qu'un seul pixel de large. Ca pourrait plus ressembler plus aux cercles d'Andres qui ont la particularité d'effectivement couvrir le plan quand on trace des cercles concentriques là où Bresenham laisse des trous. Pour en avoir le coeur net il faut faire tourner l'algo des cercles concentriques et voir s'il reste des pixels non couverts. Sinon pour l'optim de l'algo, je pense qu'en passant les params sur la pile plutôt que les regs et en utilisant du code auto-modifiable on peut gagner un peu (j'examine cette piste). |
Auteur: | Prehisto [ 25 Mar 2019, 14:43 ] |
Sujet du message: | Re: Tracé de cercles |
Mise à jour à la suite de l'astuce de Samuel. Ce à quoi j'ai ajouté celle qui consiste à ne pas faire de "TFR D,X" quand on peut simplement faire un "PSHS D,Y" en entrée de point et "PULS X,Y" en sortie, ce qui oblige à dédoubler la routine d'affichage... et ce qui nous amène en-dessous des 3 VBL! Code: MYDP equ *<-8
setdp MYDP xc fdb 0 xr fdb 0 yc fdb 0 yr fdb 0 z fdb 0 debut equ * * Initialise l'écran ldx #mess bsr puts * Initialise le tracé clr >$6041 ldb #$06 stb >$6038 * Initialise la table des pointeurs lda #200 ldx #scrptr ldu #$4000 init0 stu ,x++ leau 40,u deca bne init0 * Initialise la table des offsets/masques ldy #320 ldx #linprm ldd #$0080 init1 std ,x++ lsrb bcc init2 rorb inca init2 leay -1,y bne init1 * Trace le cercle ldd #85 ;Rayon ldx #128 ;Centre X ldy #87 ;Centre Y bsr circle * Attend l'appui d'une touche key0 jsr >$e806 tstb bne key0 key1 jsr >$e806 tstb beq key1 swi * Affiche un message puts0 jsr >$e803 puts ldb ,x+ bne puts0 rts * Initialisation de l'écran mess fcb $1f,$20,$20 fcb $1f,$12,$14 fcb $1b,$47 fcb $1b,$50 fcb $1b,$60 fcb $0c fcb $14 fcb 0 * Trace un point pointx pshs d,y ! cmpd #320 ! bhs ptx0 ! Sort si bord cmpy #200 ! d'écran dépassé bhs ptx0 ! ldx #scrptr ! ldb 3,s ! abx ! Définit le abx ! pointeur d'écran ldx ,x ! ldd ,s ! aslb ! rola ! Lit offset/masque ldy #linprm ! ldd d,y ! orb a,x ! Trace stb a,x ! le point ptx0 puls x,y,pc ! circle pshs a,b,dp,x,y std >xr ldb #MYDP tfr b,dp stx <xc sty <yc * Y=0 clra clrb std <yr * Z = INT(X/2) ldd <xr lsra rorb std <z * (XCENTER+X,YCENTER+Y) circl0 ldd <yc addd <yr tfr d,y ldd <xc addd <xr bsr pointx * (XCENTER+X,YCENTER-Y) ldd <yc subd <yr tfr d,y bsr point * (XCENTER-X,YCENTER-Y) ldd <xc subd <xr bsr pointx * (XCENTER-X,YCENTER+Y) ldd <yc addd <yr tfr d,y bsr point * (XCENTER+Y,YCENTER+X) ldd <yc addd <xr tfr d,y ldd <xc addd <yr bsr pointx * (XCENTER+Y,YCENTER-X) ldd <yc subd <xr tfr d,y bsr point * (XCENTER-Y,YCENTER-X) ldd <xc subd <yr bsr pointx * (XCENTER-Y,YCENTER+X) ldd <yc addd <xr tfr d,y bsr point * Y = Y+1 ldd <yr addd #1 std <yr * Z=Z-Y ldd <z subd <yr std <z * IF Z<0 THEN Z=Z+X:X=X-1 bcc circl1 addd <xr std <z ldd <xr subd #1 std <xr * IF X>=Y THEN GOTO 30 circl1 ldd <xr subd <yr bcc circl0 puls a,b,dp,x,y,pc * Trace un point point pshs x,y ! cmpx #320 ! bhs point0 ! Sort si bord cmpy #200 ! d'écran dépassé bhs point0 ! ldx #scrptr ! ldb 3,s ! abx ! Définit le abx ! pointeur d'écran ldx ,x ! ldd ,s ! aslb ! rola ! Lit offset/masque ldy #linprm ! ldd d,y ! orb a,x ! Trace stb a,x ! le point point0 puls x,y,pc ! * Table des bits pour tracé de point bittab fcb $80,$40,$20,$10 fcb $08,$04,$02,$01 * Table des pointeurs d'écran scrptr rmb 200*2 * Table des offsets/masques de ligne linprm rmb 320*2 end |
Auteur: | Samuel Devulder [ 25 Mar 2019, 16:39 ] |
Sujet du message: | Re: Tracé de cercles |
Voici ma version Code: (main)CIRCLE setdp $60 PLOTX equ $603D PLOTY equ $603F TEMP equ $606C org $9000 debut equ * * Initialise l'écran ldx #mess bsr puts * Initialise la table des pointeurs ldx #scrptr ldd #$4000 init0 std ,x++ addd #40 cmpx #scrmsk bne init0 * initialise la table des maques ldd #$8000 init1 std ,x++ lsra bcc init1 rora incb cmpb #40 bne init1 * Trace le cercle ldd #85 ;Rayon ldx #128 ;Centre X ldy #87 ;Centre Y bsr circle * Attend l'appui d'une touche key0 jsr >$e806 tstb bne key0 key1 jsr >$e806 tstb beq key1 swi rts * Affiche un message puts0 jsr >$e803 puts ldb ,x+ bne puts0 rts (info) * Initialisation de l'écran mess fcb $1f,$20,$20 fcb $1f,$12,$14 fcb $1b,$47 fcb $1b,$50 fcb $1b,$60 fcb $0c fcb $14 fcb 0 circle pshs a,b,dp,x,u lda #$60 tfr a,dp stx <PLOTX sty <PLOTY * X=rayon ldx ,s * Y=0 ldu #0 * Z=rayon/2 lda ,s lsra rorb circl0 bsr plot8 * Y = Y+1 leau 1,u * Z = Z - Y stu <TEMP subd <TEMP * IF Z<0 THEN Z=Z+X:X=X-1 bcc circl1 stx <TEMP addd <TEMP leax -1,x stu <TEMP * IF X>=Y THEN GOTO 30 circl1 cmpx <TEMP bcc circl0 puls a,b,dp,x,u,pc (info) * Trace 8 points (262+8*73=846) plot8 pshs d,x,u * xc+x,yc+y ldd <PLOTX addd 2,s pshs d ldd <PLOTY addd 6,s pshs d bsr plot * xc+x,yc-y ldd <PLOTY subd 8,s std ,s bsr plot * xc-x,yc-y ldd <PLOTX subd 6,s std 2,s bsr plot * xc-x,yc+y ldd <PLOTY addd 8,s std ,s bsr plot * xc+y,yc+x ldd <PLOTX addd 8,s std 2,s ldd <PLOTY addd 6,s std ,s bsr plot * xc+y,yc-x ldd <PLOTY subd 6,s std ,s bsr plot * xc-y,yc-x ldd <PLOTX subd 8,s std 2,s bsr plot * xc+y,yc+x ldd <PLOTY addd 6,s std ,s bsr plot leas 4,s puls d,x,u,pc (info) * Trace un point (73cycles) plot ldd 2,s subd #200 bhs plot0 lslb rola ldx #scrptr+400 ldu d,x ldd 4,s subd #320 bhs plot0 lslb rola ldx #scrmsk+640 ldd d,x ora b,u sta b,u plot0 rts (info) echo code=&*-debut * Table des pointeurs d'écran scrptr rmb 200*2 * Table avec le mask et l'offset scrmsk rmb 320*2 echo data=&*-scrptr end debut Finalement je n'ai pas utilisé de code automodifié, mais les emplacements prévus dans la page 0 du moniteur. Tout marcherait impec en rom. La taille est très compacte (243 octets) et au niveau vitesse il me semble correct. L'affichage des 8 points se fait en 846 cycles, mais je ne sais pas comment compter les cycles pour l'ensemble du cercle de 85 pixels car parfois on fait le correctif Z=Z+X; X=X+1 et parfois pas. Au plus un tour de boucle "cercl0" coute 56cycles avec le correctif et 35 cycles sans lui. @Prehisto: comment comptes tu les cycles pour la boucle principale ? Tu estimes que le correctif n'est fait qu'une fois tous les deux pixels environ ? Ca nous ferait la boucle moyenne à 45 cycles, qui est executé 85/2 fois.. donc peut-être quelque chose comme (45 + 846)*85/2 = 37 888 cycles. 2 VBL ? Ca me parrait faible, mais c'est vrai qu'à l'écran le cercle apparait super rapidement (on n'a pas le temps de le voir dessiner) Enfin, j'ai fait le test du remplissage d'écran. Il apparait une figure de moiré (donc des trous). Ce n'est donc pas le cercle d'Andres, mais plus probablement un Bresenham fichtrement efficace. |
Page 1 sur 3 | Heures au format UTC + 1 heure |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |