Samuel Devulder a écrit:
on peut monter à combien si on optimise la gestion de mémoire forme ?
Ben voyons alors.
On avait
Citation:
- 2eme écriture... (PC=$C0D4 Page 000 -> fond)
Cela nous amène à ce bout de code
Code:
C0BC EC84 LDD ,X 5
C0BE EDC4 STD ,U 5
C0C0 EC02 LDD $02,X 6
C0C2 ED42 STD $02,U 6
C0C4 EC04 LDD $04,X 6
C0C6 ED44 STD $04,U 6
C0C8 EC06 LDD $06,X 6
C0CA ED46 STD $06,U 6
C0CC EC08 LDD $08,X 6
C0CE ED48 STD $08,U 6
C0D0 EC0A LDD $0A,X 6
C0D2 ED4A STD $0A,U 6
C0D4 EC0C LDD $0C,X 6 <== ICI
C0D6 ED4C STD $0C,U 6
C0D8 EC0E LDD $0E,X 6
C0DA ED4E STD $0E,U 6
C0DC EC8810 LDD $10,X 6
C0DF EDC810 STD $10,U 6
C0E2 EC8812 LDD $12,X 6
C0E5 EDC812 STD $12,U 6
C0E8 EC8818 LDD $18,X 6
C0EB EDC828 STD $28,U 6
C0EE EC881A LDD $1A,X 6
C0F1 EDC82A STD $2A,U 6
C0F4 EC881C LDD $1C,X 6
C0F7 EDC82C STD $2C,U 6
C0FA EC881E LDD $1E,X 6
C0FD EDC82E STD $2E,U 6
C100 EC8820 LDD $20,X 6
C103 EDC830 STD $30,U 6
C106 EC8822 LDD $22,X 6
C109 EDC832 STD $32,U 6
C10C EC8824 LDD $24,X 6
C10F EDC834 STD $34,U 6
C112 EC8826 LDD $26,X 6
C115 EDC836 STD $36,U 6
C118 EC8828 LDD $28,X 6
C11B EDC838 STD $38,U 6
C11E EC882A LDD $2A,X 6
C121 EDC83A STD $3A,U 6
C124 EC8830 LDD $30,X 6
C127 EDC850 STD $50,U 6
C12A EC8832 LDD $32,X 6
C12D EDC852 STD $52,U 6
C130 EC8834 LDD $34,X 6
C133 EDC854 STD $54,U 6
C136 EC8836 LDD $36,X 6
C139 EDC856 STD $56,U 6
C13C EC8838 LDD $38,X 6
C13F EDC858 STD $58,U 6
C142 EC883A LDD $3A,X 6
C145 EDC85A STD $5A,U 6
C148 EC883C LDD $3C,X 6
C14B EDC85C STD $5C,U 6
C14E EC883E LDD $3E,X 6
C151 EDC85E STD $5E,U 6
C154 EC8840 LDD $40,X 6
C157 EDC860 STD $60,U 6
C15A EC8842 LDD $42,X 6
C15D EDC862 STD $62,U 6
C160 EC8848 LDD $48,X 6
C163 EDC878 STD $78,U 6
C166 EC884A LDD $4A,X 6
C169 EDC87A STD $7A,U 6
C16C EC884C LDD $4C,X 6
C16F EDC87C STD $7C,U 6
C172 EC884E LDD $4E,X 6
C175 EDC87E STD $7E,U 6
C178 EC8850 LDD $50,X 6
C17B EDC90080 STD $0080,U 9
C17F EC8852 LDD $52,X 6
C182 EDC90082 STD $0082,U 9
C186 EC8854 LDD $54,X 6
C189 EDC90084 STD $0084,U 9
C18D EC8856 LDD $56,X 6
C190 EDC90086 STD $0086,U 9
C194 EC8858 LDD $58,X 6
C197 EDC90088 STD $0088,U 9
C19B EC885A LDD $5A,X 6
C19E EDC9008A STD $008A,U 9
C1A2 39 RTS 5
Bon on voit tout de suite (
humm.. enfin si vous êtes des aliens, sinon croyez moi sur parole) que ce code est la
répétition de 4 fois la même partie qui recopie 20 octets entre X et U via le registre D. L'ensemble se fait en 496 cycles ce qui est assez rapide (en moyenne 6.2 cycles par octet recopié). Cependant, ma grande expérience de codeur génial (
NDLR: ca va les chevilles ?), heu mon petit doigt me dit que c'est peut-être sub-optimal car cela n'utilise pas les instructions de pile qui sont les plus rapide pour lire/écrire des octets en mémoire sur mc6809.
Sous le debugger on trouve que les drapeaux I et F du CC sont positionnés tout le long de cette routine, ce qui signifie qu'on ne sera pas soumis à l'utilisation de la pile par les interruptions en ce point là du code. On peut donc user U et "
abuser" de S (void les (!) dans le code) pour faire des copies rapides. C'est ce que je vous propose dans le code suivant:
Code:
C0BC 3478 PSHS U,Y,X,DP 12 Sauvegardes regs utilisés
C0BE 10FFC117 STS $C117 7 (!) Sauvegarde de S pour la sortie
C0C2 3284 LEAS ,X 4 Plus rapide que TFR X,S.
C0C4 3347 LEAU $07,U 5 U va marcher "en descendant", donc il faut pré-avancer de 7 places
C0C6 353E PULS A,B,DP,X,Y 12 Lecture rapide de 7 octets
C0C8 363E PSHU Y,X,DP,B,A 12 Ecriture rapide des 7 octets
C0CA 334E LEAU $0E,U 5 On avance aux 7 octets suivants (notez le $0E=7*2)
C0CC 353E PULS A,B,DP,X,Y 12 Lecture...
C0CE 363E PSHU Y,X,DP,B,A 12 Ecriture de 7 octets
C0D0 334D LEAU $0D,U 5 Avance de 7+6 octets
C0D2 3536 PULS A,B,X,Y 11 Lecture...
C0D4 3636 PSHU Y,X,B,A 11 Ecriture de 6 octets (7+7+6 = 20)
C0D6 3264 LEAS $04,S 5 Avance les entrées à la ligne suivante
C0D8 33C821 LEAU $21,U 5 Avance le pointeur écran à la ligne suivante
C0DB 353E PULS A,B,DP,X,Y 12
C0DD 363E PSHU Y,X,DP,B,A 12
C0DF 334E LEAU $0E,U 5
C0E1 353E PULS A,B,DP,X,Y 12
C0E3 363E PSHU Y,X,DP,B,A 12
C0E5 334D LEAU $0D,U 5
C0E7 3536 PULS A,B,X,Y 11
C0E9 3636 PSHU Y,X,B,A 11
C0EB 3264 LEAS $04,S 5
C0ED 33C821 LEAU $21,U 5
C0F0 353E PULS A,B,DP,X,Y 12
C0F2 363E PSHU Y,X,DP,B,A 12
C0F4 334E LEAU $0E,U 5
C0F6 353E PULS A,B,DP,X,Y 12
C0F8 363E PSHU Y,X,DP,B,A 12
C0FA 334D LEAU $0D,U 5
C0FC 3536 PULS A,B,X,Y 11
C0FE 3636 PSHU Y,X,B,A 11
C100 3264 LEAS $04,S 5
C102 33C821 LEAU $21,U 5
C105 353E PULS A,B,DP,X,Y 12
C107 363E PSHU Y,X,DP,B,A 12
C109 334E LEAU $0E,U 5
C10B 353E PULS A,B,DP,X,Y 12
C10D 363E PSHU Y,X,DP,B,A 12
C10F 334D LEAU $0D,U 5
C111 3536 PULS A,B,X,Y 11
C113 3636 PSHU Y,X,B,A 11
C115 10CEBC59 LDS #$BC59 4 (!) Recuperation du S initial
C119 35F8 PULS DP,X,Y,U,PC 14 Récupération de tous les registres modifiés
Cette version ne fait pas seulement qu'abuser de S, mais aussi du registre DP (direct-page) qui nous permet de lire ou écrire 7 octets avec une seule instruction de pile (12 cycles chaque) soit une belle moyenne de 4.1 cycles/octets-recopiés au lieu des 6.2 précédents. La recopie d'une ligne passe ainsi de 20 instructions à seulement 10 qui sont déroulées 4 fois pour s'épargner le temps des couples BSR+RTS (4*(7+5)=48 cycles, soit le temps de recopier 1/2 ligne) et surtout parce qu'on a de la place (le code d'origine est énorme avec 230 octets).
Le tout est au final
plus court de 136 octets (60%) que le code d'origine et tourne en 396 cycles au lieu de 496, soit
~20% plus rapide. Globalement le rafraichissement est tombé à 464+93501=
94 ms au lieu de 104ms. Donc
10% de gain après avoir optimisé la copie de la ram vidéo fond et forme (
5% avec le fond, 5% avec la forme). C'est logique mais pas mal !
On remarque aussi que ce code est juste celui qui suit notre patch précédent. Aussi on peut l'étendre pour patcher ces deux là d'un coup.
Fichier(s) joint(s):
Commentaire: Patch combiné à appliquer entre $C06B et $C11A
C06B_C11A.zip [2.16 Kio]
Téléchargé 562 fois
A noter: