CODINGApprendre pas à pas la programmation en assembleur Z80 ★ Programmation avancée, routines utiles ★

Routines de multiplication

Multiplication en assembleur Z80


Le Z80 est un processeur 8 bits, il n'est pas capable de réaliser nativement des divisions ou des multiplications. Voici une compilation de routines de multiplications (wikiti, Z80 heaven, grauw, cpcwiki)


8 x 8 multiplication non signée => HL

multiply_h_e
ld d,0
sla h
sbc a
and e
ld l,a
ld b,7
.loop
add hl,hl
jr nc,$+3 ; si le bit est présent, ajouter la puissance
add hl,de
djnz .loop
ret


Version déroulée plus rapide :

multiply_h_e
ld d,0
ld l,d

sla h ; injecter le premier bit
jr nc,$+3
ld l,e

repeat 6
  add hl,hl
  jr nc,$+3 ; si le bit est présent, ajouter la puissance
  add hl,de
rend

add hl,hl
ret nc
add hl,de
ret


16 x 8 multiplication non signée => A:HL

multiply_de_a
ld bc,#700 ; B=7 init C=0
ld h,c
ld l,c

add a ; première itération optimisée
jr nc,.loop
ld h,d
ld l,e

.loop
add hl,hl
rla
jr nc,.skip
add hl,de
adc c ; comme C vaut zéro, ici on propage simplement la retenue dans A
.skip
djnz .loop
ret


Version déroulée plus rapide :

multiply_de_a
ld c,0
ld h,c
ld l,c

add a ; première itération optimisée
jr nc,.loop
ld h,d
ld l,e

repeat 6
  add hl,hl
  rla
  jr nc,@skip ; le @ pour un label local dans une boucle REPEAT
  add hl,de
  adc c ; comme C vaut zéro, ici on propage simplement la retenue dans A
  @skip
rend
; dernière itération
add hl,hl
rla
ret nc
add hl,de
adc c
ret


16 x 16 multiplication non signée => A:HL

multiply_de_bc
ld hl,0
; première itération
sla e
rl d
jr nc,.skipFirst
ld h,b
ld l,c
.skipFirst

ld a,15
.loop
add hl,hl
rl e
rl d
jr nc,.skipNext
add hl,bc
jr nc,.skipNext
inc de
.skipNext
dec a
jr nz,.loop
ret


Je vous laisse dérouler hein ;)

16 x 16 multiplication signée => DE:HL

multiply_de_bc ; résultat dans DE:HL
xor a
ld h,a : ld l,a ; HL = A = 0

bit 7,d
jr z,.muldpos
sbc hl,bc
.muldpos

or b
jp p,.mulbpos
sbc hl,de
.mulbpos

ld a,16
.loop
add hl,hl
rl e
rl d
jr nc,.mul0bit
add hl,bc
jr nc,.mul0bit
inc de
.mul0bit
dec a
jr nz,.loop
ret

★ ANNÉE: 2025
★ AUTEUR: Roudoudou

Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.732-desktop/c
Page créée en 382 millisecondes et consultée 4 fois

L'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.