π
<-

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

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

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

Messagede grosged » 11 Juin 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: Tout sélectionner
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: Tout sélectionner
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
Dernière édition par grosged le 11 Juin 2016, 21:29, édité 2 fois.
Avatar de l’utilisateur
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 32.2%
 
Messages: 773
Images: 92
Inscription: 14 Sep 2011, 12:29
Genre: Homme
Calculatrice(s):
MyCalcs profile

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

Messagede Adriweb » 11 Juin 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
Avatar de l’utilisateur
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 82.1%
 
Messages: 14883
Images: 1211
Inscription: 01 Juin 2007, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: adriweb
GitHub: adriweb

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

Messagede grosged » 11 Juin 2016, 11:26

Merci ;) Oui, ça prend plus de place, mais vu le gain en vitesse, ça reste raisonnable, non? ;)
Dernière édition par grosged le 11 Juin 2016, 11:32, édité 2 fois.
Avatar de l’utilisateur
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 32.2%
 
Messages: 773
Images: 92
Inscription: 14 Sep 2011, 12:29
Genre: Homme
Calculatrice(s):
MyCalcs profile

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

Messagede Adriweb » 11 Juin 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
Avatar de l’utilisateur
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 82.1%
 
Messages: 14883
Images: 1211
Inscription: 01 Juin 2007, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: adriweb
GitHub: adriweb

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

Messagede Lionel Debroux » 11 Juin 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.
Avatar de l’utilisateur
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 11.4%
 
Messages: 6875
Inscription: 23 Déc 2009, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: -
GitHub: debrouxl

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

Messagede Adriweb » 12 Juin 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
Avatar de l’utilisateur
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 82.1%
 
Messages: 14883
Images: 1211
Inscription: 01 Juin 2007, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: adriweb
GitHub: adriweb

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

Messagede grosged » 12 Juin 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: Tout sélectionner
        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: Tout sélectionner
        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 !!!)
Dernière édition par grosged le 12 Juin 2016, 09:21, édité 3 fois.
Avatar de l’utilisateur
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 32.2%
 
Messages: 773
Images: 92
Inscription: 14 Sep 2011, 12:29
Genre: Homme
Calculatrice(s):
MyCalcs profile

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

Messagede Lionel Debroux » 12 Juin 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.
Avatar de l’utilisateur
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 11.4%
 
Messages: 6875
Inscription: 23 Déc 2009, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: -
GitHub: debrouxl

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

Messagede grosged » 12 Juin 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)
Avatar de l’utilisateur
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Prochain niv.: 32.2%
 
Messages: 773
Images: 92
Inscription: 14 Sep 2011, 12:29
Genre: Homme
Calculatrice(s):
MyCalcs profile

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

Messagede Adriweb » 12 Juin 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
Avatar de l’utilisateur
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 82.1%
 
Messages: 14883
Images: 1211
Inscription: 01 Juin 2007, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: adriweb
GitHub: adriweb

Suivante

Retourner vers Langages alternatifs

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 11 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Ndless for CX 4.5.5 / CX II 6.2.0
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 !
12345
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
2432 utilisateurs:
>2412 invités
>13 membres
>7 robots
Record simultané (sur 6 mois):
32248 utilisateurs (le 01/09/2025)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)