oh oui c'est encore mieux ca 319-machin... pas de CMPD (que j'aime pas: trop lent)
Bien vu!
Ca donne ca:
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 #$0128
init1 std ,x++
lsla
bcc init1
rola
decb
bge init1
* Trace le cercle
ldd #85 ;Rayon
ldx #128 ;Centre X
ldy #87 ;Centre Y
* loop
bsr circle
* subd #1
* bne loop
* 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
(info)
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
(info)
puls a,b,dp,x,u,pc
(info)
* Trace 8 points (272+8*64-5=779 cycles)
* X = offset en abcisse, U = offset en ordonée,
* (PLOTX,PLOTY) = centre cercle (xc,yc)
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
ldd ,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
ldd ,s
bsr plot
* xc-y,yc+x
ldd <PLOTY
addd 6,s
* std ,s ! inutile pour le dernier point, 5 cycles de gagnés
bsr plot
leas 4,s
puls d,x,u,pc
(info)
* Trace un point (64 cycles).
* D contient l'ordonnée (qui est aussi en "2,S").
* L'abscisse est en "4,S"
plot subd #200 ! hors écran en Y ?
bhs plot0 ! oui ==> terminé
ldx #scrmsk ! pointeur ecran
lslb !
rola !
ldu d,x ! récupération pointeur écran
ldd #319 ! largeur ecran - 1
subd 4,s ! abscisse hors écran ?
bcs plot0 ! oui ==> terminé
lslb !
rola !
ldd d,x ! recupération mask et décalage horizontal
ora b,u !
sta b,u ! mise à jour écran
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
Un point ne prends plus que 64 cycles. Les 8 points sont affichés en 779 cycles, ce qui nous fait, d'après la formule, le cercle en (45 + 779)*61 = 50264 cycles, soit encore 1769 cycles de gagnés.