Astuces en vrac d'optimisation de code assembleur Z80Plutôt que ld a,0 ; + lent mais ne change pas les flags!Écrivez ceci xor a ; 1 octet de moins, 1 nop de moins (change les flags!) Plutôt que sla a ; A = A x 2sla h rl l ; HL = HL x 2Écrivez ceci add a ; A = A x 2add hl,hl ; HL = HL x 2 Plutôt que ld b,10 ld c,50Écrivez ceci ld bc,(10<<8)|50 ; 1 octet de moins, 1 nop de moins Plutôt que ld a,#DD ld (hl),aÉcrivez directement ceci ld (hl),#DD ; 1 octet de moins, 1 nop de moins Plutôt que ld a,(variable) inc a ld (variable),a ; total de 7 octets et 9 nopsÉcrivez ceci (vous pouvez même supprimer la dernière ligne si vous n'avez pas besoin de HL ensuite, c'est encore plus rapide) ld hl,variable inc (hl) ld a,(hl) ; total de 5 octets et 8 nops Plutôt que ld a,(hl) ld (de),a inc hl inc de ; total de 4 octets et 8 nopsÉcrivez ceci ldi inc bc ; total de 3 octets et 7 nops Plutôt que cp 0Écrivez ceci or a Plutôt que neg add valeurÉcrivez ceci cpl add valeur+1 Plutôt que ld a,b negÉcrivez ceci xor a sub b Plutôt que cp valeur jr c,label jr z,label ; note: c'est bien deux fois le même label utiliséÉcrivez ceci cp valeur+1 jr c,label Plutôt que call routine retÉcrivez ceci jp routine Plutôt que or a : jp z,A_vaut_zero cp 1 : jp z,A_vaut_un cp 2 : jp z,A_vaut_deux ...Écrivez ceci (pour beaucoup de valeurs, utilisez une lookup table) or a : jp z,A_vaut_zero dec a : jp z,A_vaut_un dec a : jp z,A_vaut_deux ...Avec une lookup add a ld (recupSaut+1),a recupSaut ld hl,(table_de_sauts) jp (hl)align 256 table_de_sauts ; table alignée sur 256 octets defw saut1,saut2,saut3,saut4,saut5,saut6 ...Par extension si on ne part pas de zéro... Plutôt que cp 40 : jp z,A_vaut_40 cp 41 : jp z,A_vaut_41 cp 42 : jp z,A_vaut_42 ...Écrivez ceci (pour beaucoup de valeurs, utilisez une lookup table) sub 40 : jp z,A_vaut_40 dec a : jp z,A_vaut_41 dec a : jp z,A_vaut_42 ...Avec une lookup sub 40 ; ou alors remplir le début de la table avec 40 sauts factices add a ld (recupSaut+1),a recupSaut ld hl,(table_de_sauts) jp (hl)align 256 table_de_sauts ; table alignée sur 256 octets defw saut1,saut2,saut3,saut4,saut5,saut6 ... Plutôt que dec bc ld a,b or c ret z ; ou autre saut conditionnel sur zéroÉcrivez ceci cpi ; incrémentation de HL au passage ret po Plutôt que cp 1Écrivez ceci dec a Plutôt que bit 0,a jr z,labelÉcrivez ceci rra jr nc,label Plutôt que bit 7,a jr z,labelÉcrivez ceci rla jr nc,label Plutôt que ld l,(hl) ; multiplication par 64 d'une valeur ld h,0 ; pointée par HL add hl,hl add hl,hl add hl,hl add hl,hl add hl,hl add hl,hlÉcrivez ceci ld h,(hl) ; récupérer dans le poids fort ld l,0 ; pour multiplier par 256 srl hl srl hl ; voir chapitre des supers instructions ;) Pour les grosses copies mémoire, plutôt que ldirÉcrivez cette fonction FastLDIR ; thanks grauw xor a sub c and 15 add a ld (.automod+1),a .automod jr nz,$ ; code automodifié .loop repeat 16 : ldi : rend jp pe,.loop Plutôt qu'un LDIR ldirCette version précalcule le saut à la compilation pour être encore plus rapide mais ne traite pas les longueurs dynamiquesrepeat 64,x ldi64_sub{64-x} ldi rend jp pe,ldi64 retmacro ultraFastLDIR longueur lngmod=longueur%64 ld bc,{longueur} call ldi64_sub{lngmod} mend Évitez de soustraire quand c'est possible ld de,2000 xor a ; obligé de mettre la carry à zéro! sbc hl,deÉcrivez ceci ld de,-2000 add hl,deRoudoudou CPCrulez[Content Management System] v8.732-desktop/c Page créée en 374 millisecondes et consultée 45 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|