Page 1 of 1

[ASM] FasterCopy (fastcopy optimisé pour TIs récentes)

Unread postPosted: 01 Jan 2016, 14:50
by grosged
En partant de la routine IonFastCopy décrite sur http://wikiti.brandonw.net/index.php?ti ... onFastCopy
Code: Select all
;-----> Copy the gbuf to the screen (fast)
;Input: nothing
;Output: graph buffer is copied to the screen
fastCopy:
di
ld a,$80
out ($10),a
ld hl,plotSScreen-12-(-(12*64)+1)
ld a,$20
ld c,a
inc hl
dec hl
fastCopyAgain:
ld b,64
inc c
ld de,-(12*64)+1
out ($10),a
add hl,de
ld de,10
fastCopyLoop:
add hl,de
inc hl
inc hl
inc de
ld a,(hl)
out ($11),a
dec de
djnz fastCopyLoop
ld a,c
cp $2B+1
jr nz,fastCopyAgain
ret

D'après mes calculs, cette routine dure 51588 T-States.

J'ai vite remarqué qu'en fonction de la TI utilisée, il était parfois possible d'accélérer la routine.
En effet, concernant mes TI-82 Plus et TI-84 Pocket.fr, nul besoin d'attendre un certain délai entre chaque écriture de port (instruction Out) alors qu'avec mon ancienne TI-83 Plus (de 1997), il est impératif d'avoir un délai minimum d'exactement 45 T-States entre chaque out($11),a et bien plus encore concernant ma TI-83 Parcus !

J'ai donc réfléchi à une sorte de super FastCopy destiné aux modèles TI les plus rapides.
Voici ce que ça donne:
Code: Select all
       di            ; 4 Interdit les interruptions.
       ld a,1                ; (7) bascule en mode
       out($10),a            ; (11) d'affiche 8-bit.
       in a,($10)            ; (10) controleur LCD assez rapide?
       rla                    ; (4) bit7 à 1 ? (veut dire "occupé")
       jr c,ClassicFastCopy   ; (12/7) oui? Alors on pars vers le classique fastcopy.
                                        ; sinon, on peut travailler sans délai !
       ld hl,plotSScreen+767   ; 10 Fin du buffer (=coin inf.droit).
       ld c,$11         ; 7 Port de données (lcd data port).
       ld a,6            ; 7 Après chaque "out($11)," (data port), la pos. d'écriture
       out($10),a         ; 11 video bougera d'1 octet vers la gauche.
       
       ld a,$2b              ; 7    colonne 12 (tout à droite)
       out($10),a         ; 11
       ld a,$bf         ; 7 et dernière ligne tout en bas, donc on
ligne:
       out ($10),a         ; 11 modifie la position verticale.
       outd            ; 16 Equivaut à out(c),(hl) / dec hl / dec b
       outd            ; 16 Ecriture d'une
       outd            ; 16 ligne
       outd            ; 16 entière
       outd            ; 16 de
       outd            ; 16 données
       outd            ; 16 (donc 12 octets)
       outd            ; 16 Lorsque la position d'écriture
       outd            ; 16 arrive complètement à gauche,
       outd            ; 16 elle repasse , ensuite,
       outd            ; 16 automatiquement à l'opposé
       outd            ; 16 (donc comme au début: tout à droite).
       dec a            ; 4 On passe à la ligne supérieure.
       jp m,ligne         ; 10 Pas encore sous $80 ? alors on boucle.
       ret            ; 10 Terminé.

ClassicFastCopy:         ; ici la routine fastcopy classique...
                                     ; (...)

Ce qui nous donne un total de 14001 T-States (on a presque divisé le temps précédent par 4 !)
1 T-State=1/6 microseconde à 6Mhz
Ce qui nous donne 13233/6 = env. 2333 microsecondes pour la TI-82 Plus

Re: [ASM] Améliorer la routine IFastCopy

Unread postPosted: 01 Jan 2016, 22:54
by Adriweb
Bien joué :D

Re: [ASM] Améliorer la routine IFastCopy

Unread postPosted: 06 Jan 2016, 19:30
by grosged
Merci Adriweb :D
J'ai fait une petite mise à jour du post initial (j'ai ajouté en début de routine un test pour évaluer la rapidité du contrôleur LCD)