Logicielsmoto.com

Nous sommes le 15 Sep 2019, 21:06

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 33 messages ]  Aller à la page 1, 2, 3  Suivante
Auteur Message
 Sujet du message: Tracé de cercles
MessagePosté: 22 Mar 2019, 22:15 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1111
Localisation: Brest
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.
phpBB [video]

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 23 Mar 2019, 23:10 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
C'est absolument gé-nial! :good: :good: 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.

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 08:54 
Hors ligne

Inscription: 24 Juil 2010, 16:08
Messages: 417
Localisation: France
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? :W


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 09:58 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
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 ;)

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 10:21 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
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

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 10:39 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
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 :L

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

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 11:08 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
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  !

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 11:32 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
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

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 12:02 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
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

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 12:18 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1111
Localisation: Brest
Quelques idées sur le plot:
Code:
       ldx     #$4000  ! Calcule
       leax    d,x     ! pointeur
coute 3+8=11 cycles alors que
Code:
    ADDA #$40
    TFR   D,X
fait la même chose en 8 cycles seulement (et moins d'octets)

plus loin
Code:
       ldd     ,s     !
       lsra           !
       rorb           !
       lsra           ! X / 8
       rorb           !
       lsra           !
       rorb           !
       leax    d,x    Ajuste pointeur
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. Bref
Code:
       ldd     ,s     !
       lsra           !
       rorb           ! X/8
       lsrb
       lsrb
       lsrb
       abx           Ajuste pointeur
fait pareil, mais en plus rapide. ([EDIT] ah oui tu l'as vu aussi dans le code ci-dessus)

Enfin pour la mul par 40, comme Y<=200<256, on peut faire ainsi:
Code:
   ldb     3,s    !
   lda     #40
   mul
([EDIT] mais j'aime assez la table de precalc ci-dessus, qui doit être un peu plus rapide)

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

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 13:05 
Hors ligne

Inscription: 06 Juin 2004, 08:23
Messages: 373
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 13:11 
Hors ligne

Inscription: 24 Juil 2010, 16:08
Messages: 417
Localisation: France
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 13:29 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1111
Localisation: Brest
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).

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 14:43 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
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

_________________
Marche a suivre pour s'inscrire sur ce forum
Do not forget to contact one of the administrators to validate your registration.
Le site des démos de Puls
L'émulateur Teo


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tracé de cercles
MessagePosté: 25 Mar 2019, 16:39 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1111
Localisation: Brest
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.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 33 messages ]  Aller à la page 1, 2, 3  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com