π
<-

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

Assembleur, Axe, C/C++, ICE...

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

Unread postby grosged » 11 Jun 2016, 10:30

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
Last edited by grosged on 11 Jun 2016, 21:29, edited 2 times in total.
User avatar
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 30.2%
 
Posts: 770
Images: 75
Joined: 14 Sep 2011, 12:29
Gender: Not specified
Calculator(s):
MyCalcs profile

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

Unread postby Adriweb » 11 Jun 2016, 11:09

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é :)

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
My calculator programs
Mes programmes pour calculatrices
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 79.7%
 
Posts: 14820
Images: 1131
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: adriweb
GitHub: adriweb

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

Unread postby grosged » 11 Jun 2016, 11:26

Merci ;) Oui, ça prend plus de place, mais vu le gain en vitesse, ça reste raisonnable, non? ;)
Last edited by grosged on 11 Jun 2016, 11:32, edited 2 times in total.
User avatar
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 30.2%
 
Posts: 770
Images: 75
Joined: 14 Sep 2011, 12:29
Gender: Not specified
Calculator(s):
MyCalcs profile

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

Unread postby Adriweb » 11 Jun 2016, 11:32

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 :)

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
My calculator programs
Mes programmes pour calculatrices
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 79.7%
 
Posts: 14820
Images: 1131
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: adriweb
GitHub: adriweb

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

Unread postby Lionel Debroux » 11 Jun 2016, 11:34

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 :)
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6869
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

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

Unread postby Adriweb » 12 Jun 2016, 00:28

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

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
My calculator programs
Mes programmes pour calculatrices
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 79.7%
 
Posts: 14820
Images: 1131
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: adriweb
GitHub: adriweb

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

Unread postby grosged » 12 Jun 2016, 08:28

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 !!!)
Last edited by grosged on 12 Jun 2016, 09:21, edited 3 times in total.
User avatar
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 30.2%
 
Posts: 770
Images: 75
Joined: 14 Sep 2011, 12:29
Gender: Not specified
Calculator(s):
MyCalcs profile

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

Unread postby Lionel Debroux » 12 Jun 2016, 08:40

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 :)
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6869
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

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

Unread postby grosged » 12 Jun 2016, 08:52

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)
User avatar
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 30.2%
 
Posts: 770
Images: 75
Joined: 14 Sep 2011, 12:29
Gender: Not specified
Calculator(s):
MyCalcs profile

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

Unread postby Adriweb » 12 Jun 2016, 10:38

Super :)

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
My calculator programs
Mes programmes pour calculatrices
User avatar
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 79.7%
 
Posts: 14820
Images: 1131
Joined: 01 Jun 2007, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Twitter: adriweb
GitHub: adriweb

Next

Return to Langages alternatifs

Who is online

Users browsing this forum: ClaudeBot [spider] and 2 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
954 utilisateurs:
>917 invités
>28 membres
>9 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)