Code : Tout sélectionner
GETPOS.M
69E1 3410 PSHS X 7 NOTE: etonnement dans SETPOS on ne protège pas le contenu de X. Pourquoi? On put gagner 14 cycles en éliminant le PSHS/PULS X
69E3 AEC1 LDX ,U++ 8 ==> LDX ,U (5)
69E5 EC81 LDD ,X++ 8 ==> LDD ,X (5)
69E7 3606 PSHU B,A 7 ==> STD ,U (5)
69E9 EC84 LDD ,X 5 ==> LDD 2,X (6) GAIN 7 cycles
69EB 3510 PULS X 7
69ED 0EB4 JMP /$B4 3
Code : Tout sélectionner
ADDPOS.M
69FC EC44 LDD $04,U 6
69FE E3D4 ADDD [,U] 9
6A00 EDD4 STD [,U] 8
6A02 ECC4 LDD ,U 5
6A04 C30002 ADDD #$0002 4
6A07 EDC4 STD ,U 5
6A09 EC42 LDD $02,U 6
6A0B E3D4 ADDD [,U] 9
6A0D EDD1 STD [,U++] 11 ==> STD [,U] (8)
6A0F 3342 LEAU $02,U 5 ==> LEAU 4,U (5)
6A11 0EAC JMP /$AC 3
Code : Tout sélectionner
(7) PSHS X optionnel si on a le droit d'écraser X
(5) LDX ,U
(6) LDD 4,U
(6) ADDD ,X
(5) STD ,X
(5) LDD 2,U
(7) ADDD 2,X
(6) STD 2,X
(7) PULS X optionnel
(5) LEU 6,U
(3) JMP /$AC (TOTAL 62us)
Plus loin, dans V/32 et V/8 au lieu de faire "LDD ,U++" en 8 cycles, un "PULU D" en 7 cycles est plus rentable.
Pour le calcule de ABS, on peut gagner en calculant "negd" autrement qu'avec des SUB (exemple COMA COMB ADDD#1, mais je préfère NEGA NEGB SBCA #0) et en écrivant le résulat que si on change effectivement la valeur:
Code : Tout sélectionner
(6) LDD 2,U
(3) BGE --------+
(2) NEGA |
(2) NEGB |
(2) SBCA #0 |
(6) STD 2,U |
(6) LDD ,U <----+
(3) BGE --------+
(2) NEGA |
(2) NEGB |
(2) SBCA #0 |
(6) STD ,U |
(3) JMP /$B0<---+
Code : Tout sélectionner
(5) LDD ,U
(7) SUBD 4,U ; D=a-c
(4) STA ,U ; on a besoin que du bit 7 de D
(6) LDD 2,U
(7) SUBD 6,U ; D=b-d
(4) ANDA ,U ; bit 7 à 1 si a-c<0 et b-d<0
(2) CLRB ; reg D=1 si reg A<0, 0 sinon.
(2) LSLA
(2) ROLB
(2) SEX ; oh!
(5) LEAU 6,U ; mise à jour pile
(3) JMP /$B0 ; retour