Page 1 of 3

[eZ80] FastClr : pour effacer très rapidement l'écran!

Unread postPosted: 11 Jun 2016, 10:30
by grosged
Salut !

Ce matn , PT_ et moi avons réfléchi sur la façon la plus rapide d'effacer l'écran (en mode 8bpp)...

Voici le résultat :

Code: Select all
FastClr:
    ld  de,$555555  ; octet à écrire  (= couleur bleue)
    or  a
    sbc     hl,hl
    ld  b,217
    di
    add     hl,sp       ; on sauvegarde SP dans  HL
    ld  sp,vram+76818   ; Pour optimiser au mieux , on écrit 18 octets en trop
ClrLp:  .fill 118,$d5       ;   = 118 * "PUSH DE"
    djnz    ClrLp       ; pendant 217 fois
    ld  sp,hl       ; on restaure SP
    ei


16+4+8+8+4+4+16+217*(118*10+13)-5+4+4=258944 States !!! :#fou#: ;D
( à titre de comparaison, en utilisant le classique LDIR, on est dans les 537600 States !!)

Imaginez cette routine relocalisée en adresse $e30800 !! ça tournerait encore plus vite ! :D

** EDIT **


Encore (un peu) plus vite !

Code: Select all
FastClr:
        ld      de,$555555      ; will write byte 85 (= blue color)
        or      a
        sbc     hl,hl
        ld      b,213
        di
        add     hl,sp           ; saves SP in HL
        ld      sp,vram+76800   ; as a PUSH is decreasing SP, begin at end of 8bpp mode physical screen
ClrLp:  .fill 120,$d5           ;       = 120 * "PUSH DE"
        djnz    ClrLp           ; during 213 times
        .fill 40,$d5            ; 40 * "PUSH DE"
        ld      sp,hl           ; restore SP
        ei


16+4+8+8+4+4+16+213*(120*10+13)-5+40*10+4+4 = 258832 States =D

Re: [eZ80] FastClr : pour effacer très rapidement l'écran!

Unread postPosted: 11 Jun 2016, 11:09
by Adriweb
Intéressant - pour le coup, c'est de l'optimisation côté vitesse poussée à l'extrême (vu la taille que ça prend par rapport à d'autres méthodes plus standards :P)
Bien joué :)

Re: [eZ80] FastClr : pour effacer très rapidement l'écran!

Unread postPosted: 11 Jun 2016, 11:26
by grosged
Merci ;) Oui, ça prend plus de place, mais vu le gain en vitesse, ça reste raisonnable, non? ;)

Re: [eZ80] FastClr : pour effacer très rapidement l'écran!

Unread postPosted: 11 Jun 2016, 11:32
by Adriweb
Si le programme a besoin de tels Clear en grosse quantité pour une raison ou pour une autre, je pense que c'est tout à fait raisonnable, oui :)

Re: [eZ80] FastClr : pour effacer très rapidement l'écran!

Unread postPosted: 11 Jun 2016, 11:34
by Lionel Debroux
C'est en effet beaucoup plus rapide, mais ça nécessite de désactiver les interruptions pour un temps très long, donc ça n'est pas utilisable dans tous les contextes :)

Re: [eZ80] FastClr : pour effacer très rapidement l'écran!

Unread postPosted: 12 Jun 2016, 00:28
by Adriweb
Mateo se demande si c'est vraiment plus rapide qu'avec les ldir, sur eZ80 (ça serait le cas sans aucun souci sur z80) - parce que le ldir n'aurait pas besoin d'être re-fetché dans la "pipeline".

Le mieux serait de comparer en vrai (sur calculatrice), chronomètre en main, quelques centaines d'effacements d'écran avec les 2 méthodes.
Qui s'y colle ? :D

Re: [eZ80] FastClr : pour effacer très rapidement l'écran!

Unread postPosted: 12 Jun 2016, 08:28
by grosged
Hé bien... je m'y suis collé !

Manuellement, et sur réelle calculatrice TI83PCE (non connectée, avec un "Ram Cleared" tout frais!) , j'ai chronométré (avec http://online-stopwatch.chronme.com/) les 2 méthodes pendant 10 000 fois, gardant exactement la même boucle pour l'une et l'autre:

D'abord la méthode classique "LDIR" ...

Code: Select all
        ld              a,$27
        ld              ($e30018),a

        ld              bc,10000
BigLp:  push    bc
;----------------------------------------------------------------
       ( di )
        ld              hl,$d40000
        ld              de,$d40001
        ld              (hl),85
        ld              bc,76799
        ldir
        ( ei )
;-----------------------------------------------------------------
        pop     bc
        dec     bc
        ld              a,b
        or              c
        jp              nz,BigLp

        ld              a,$2d
        ld              ($e30018),a
        ret

Qui prend 1 minute et 59 secondes (avec ou sans interruptions, d'aiileurs!..toujours 1m59s !! )


Enfin, la méthode "PUSH"...

Code: Select all
        ld              a,$27
        ld              ($e30018),a
       
        ld              bc,10000
BigLp:  push    bc
;-----------------------------------------------------------------------
        ld      de,$555555      ; will write byte 85 (= blue color)
        or      a
        sbc     hl,hl
        ld      b,213
        di
        add     hl,sp           ; saves SP in HL
        ld      sp,vram+76800   ; begin at end of 8bpp mode physical screen
ClrLp:  .fill 120,$d5           ;       = 120 * "PUSH DE"
        djnz    ClrLp           ; during 213 times
        .fill 40,$d5            ; 40 * "PUSH DE"
        ld      sp,hl           ; restore SP
        ei
;------------------------------------------------------------------------
        pop     bc
        dec     bc
        ld              a,b
        or              c
        jp              nz,BigLp

        ld              a,$2d
        ld              ($e30018),a
        ret

Qui prend 58 secondes !!! :D :D (et même 51 secondes, si la routine est relogée en $e30800 !!!)

Re: [eZ80] FastClr : pour effacer très rapidement l'écran!

Unread postPosted: 12 Jun 2016, 08:40
by Lionel Debroux
Et si tu désactives les interruptions, pour le code utilisant ldir ?
La méthode à base de push va clairement rester plus rapide, mais le bench que tu as fait compare une routine qui désactive les interruptions et une routine qui ne les désactive pas, donc il n'est pas très équitable :)

Re: [eZ80] FastClr : pour effacer très rapidement l'écran!

Unread postPosted: 12 Jun 2016, 08:52
by grosged
Tu as raison, j'aurais dû préciser cela ;)
J'ai également réalisé le test de la méthode "LDIR" , avec les interruptions désactivées : j'ai relevé le même chrono : 1m59s !!! :)

EDIT: j'ai aussi effectué un test avec la routine principale relogée en $e30800...

On descend à 51 secondes !!! (gain de 7s)

Re: [eZ80] FastClr : pour effacer très rapidement l'écran!

Unread postPosted: 12 Jun 2016, 10:38
by Adriweb
Super :)