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.