CPC Rulez
https://cpcrulez.fr/forum/

timing sur LDI
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=4244
Page 1 sur 2

Auteur :  neocps1 [ 25 Juin 2010, 10:28 ]
Sujet du message :  timing sur LDI

Bonjour,

Qu'est ce qui est le plus rapide entre :

LDI

et

ld a,(hl)
ld (de),a
inc hl
inc de

En sachant que (comme le code l'indique), je n'ai pas besoin de décrémenter BC.

merci !

Auteur :  fano [ 25 Juin 2010, 11:13 ]
Sujet du message :  Re: timing sur LDI

Salut , c'est LDI car elle fait 5 nops , chaque LD (reg),reg fait 2 nops et l'incrémentation de HL/DE fait 2 par instructions (1 sur un registre 8 bits) , donc ça te fait 8 nops.Tu peux trouver des tableaux (incomplets) sur le Grimware (ou ici je crois aussi) ou utiliser Winape et son compteur de nops pour mesurer la vitesse de ton code (je rêve d'un profiler :D )

Auteur :  neocps1 [ 25 Juin 2010, 11:21 ]
Sujet du message :  Re: timing sur LDI

merci :)

Auteur :  AsT [ 25 Juin 2010, 11:25 ]
Sujet du message :  Re: timing sur LDI

Tout ce que tu veux savoir sur les timings est la : http://quasar.cpcscene.com/doku.php?id=iassem:timings

En effet, Ldi sera plus rapide, mais il y a plus rapide encore, l'instruction Push... Un Ldi récupère les données une à une alors qu'une instruction Push les récupère deux à deux...

Un Ldi -> 5 Nops (une valeur 8 bits)
Un Push (hl, de ou bc) -> 4 Nops (une valeurs 16 bits)

Là est toute la différence :)

Auteur :  neocps1 [ 25 Juin 2010, 11:31 ]
Sujet du message :  Re: timing sur LDI

comment optimiserais tu ce bout de code ?

ld a,(de)
ld (hl),a
inc hl
inc de
ld a,(de)
ld (hl),a
inc de
add hl,bc

Auteur :  BDCIron [ 25 Juin 2010, 12:04 ]
Sujet du message :  Re: timing sur LDI

Déjà es tu certain d'avoir besoin de faire un inc hl ou un inc de ???

Par exemple s'il s'agit de courbes a lire, places les avec un poids faible a 0. si ta courbe boucle sur 256 valeurs alors un inc l suffit...

Auteur :  neocps1 [ 25 Juin 2010, 12:12 ]
Sujet du message :  Re: timing sur LDI

j'y ai pensé, mais oui, HL est une adresse video et DE pointe vers un endroit en mémoire (n'importe où)

Auteur :  hERMOL [ 25 Juin 2010, 12:44 ]
Sujet du message :  Re: timing sur LDI

des routines d'affichage de sprites y'en a des tas ..

par exemple sur un sprite 8x8 :

Code :
; de=mem ecran
; hl=sprites source (8x8 pixels ou 8x2 octets)

ldi
ldi
dec de
dec e
add #08
ld d,a
ldi
ldi
dec de
dec e
add #08
ld d,a
ldi
ldi
dec de
dec e
add #08
ld d,a
ldi
ldi
dec de
dec e
add #08
ld d,a
ldi
ldi
dec de
dec e
add #08
ld d,a
ldi
ldi
dec de
dec e
add #08
ld d,a
ldi
ldi
dec de
dec e
add #08
ld d,a
ldi
ldi


PS: je te conseil également d'aller lire les articles A100% de Poom --> https://cpcrulez.fr/coding_menu-arcade.htm ou l'article de PICT/LOGON SYSTEM ----> https://cpcrulez.fr/coding_logon47.htm

Auteur :  neocps1 [ 25 Juin 2010, 12:45 ]
Sujet du message :  Re: timing sur LDI

hERMOL a écrit :
des routines d'affichage de sprites y'en a des tas ..


désolé, j'apprends sur le tas... :oops:

Auteur :  hERMOL [ 25 Juin 2010, 12:57 ]
Sujet du message :  Re: timing sur LDI

y'a pas de soucis, on est la pour en discuter justement :eng:

voilà une 2eme routine qui illustre la technique d'AST

Code :
; affiche sur &40 octets (ou &20 words) par la pile

; sp=spr source (&????)
; hl=mem ecran (&???0)

pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
pop de
ld (hl),e
inc l
ld (hl),d
inc l
; boucle sur la prochaine ligne

Auteur :  AsT [ 25 Juin 2010, 18:52 ]
Sujet du message :  Re: timing sur LDI

C'est exactement ça sauf que tu as oublié de preciser qu'il faut sauvegarder la Pile au depart de la routine et la restaurer à la fin :)

De plus, si tu veux que ton gfx s'affiche en #c000 et que ton gfx fait 8 octets de large, tu commences à l'adresse #c000+8.

Il ne faut pas oublier que 1 Push= 2 Dec SP... :pir8:

Auteur :  neocps1 [ 25 Juin 2010, 22:25 ]
Sujet du message :  Re: timing sur LDI

j'ai testé une routine qui utilise la pile pour faire des chargements sur 16 bit (pop de), mais elle semble perturbée par les interruptions, même en les désactivant :twisted:

Auteur :  hERMOL [ 25 Juin 2010, 22:34 ]
Sujet du message :  Re: timing sur LDI

un petit

ei
ret

en #38

doit faire l'affaire ...

Auteur :  norecess [ 26 Juin 2010, 01:43 ]
Sujet du message :  Re: timing sur LDI

Perso, je base la plupart de mes effets sur l'utilisation de la pile. Rapide... ultra rapide !
La Phat 2 concernant l'affichage fullscreen, tout est avec la pile, je vois pas comment j'aurais pu gérer l'affichage de si grosses images autrement ! :)

Auteur :  AsT [ 26 Juin 2010, 07:56 ]
Sujet du message :  Re: timing sur LDI

Le EI:RET en #38 ne sert à rien dans l'exemple cité ci dessus...

Je verrais plutôt un truc du style :
Code :
            DI
            ld (savepile+1),sp
            ld sp,data+2
            ld hl,#c000
            pop de
            ld (hl),e
            inc l
            ld (hl),d
            ..................etc....
savepile ld sp,#caca
           ei
           ret
data     defb #ff,#aa



Tu vois, pas besoin de ei ret !

Tu pourrais faire aussi un truc du style :

Code :
 
         di
         ld (savepile+1),sp
         ld sp,#c000+8
         ld hl,#ffaa
         push hl
         ld hl,#eebb
         push hl
         .... etc...
savepile ld sp,#bebe
            ei
            ret



Allez zou... Je pars au Taf !

Page 1 sur 2 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/