|
| 5.1
Les multiplications par retenues |
|
5.1.1
Multiplication de 2 entiers non signés sur 8 bits, résultat
sur 16 bits
 |
|
;****************************************************************
; Routine de multiplication de 2 entiers non signés, de 8 bits
; avec un résultat sur 16 bits
;
; En entrée :
; A <=> Multiplicande
; B <=> Multiplicateur
; En sortie :
; HL <=> Produit de A par B
; Registres affectés
; F, HL
; Remarques
; - Si A ou B = 0 => HL = 0 en sortie
; - A et B sont préservés
;
MATH_MUL_8x8:
LD HL, 0 ; Valeur de retour
; Vérification des valeurs en entrée
OR A ; Test de A
RET z ; Si A = 0 on sort
LD L, A ; Sauvegarde de A pour le test de B
LD A, B ; B est transféré dans A pour le test
OR A ; Test de B via A
LD A, L ; On restore A
LD L, H ; On efface L via H
RET z ; Si B = 0 on sort
; Début de code lié à la multiplication
PUSH BC ; Préservation de BC
PUSH DE ; Préservation de DE
LD D, L ; D est effacer par L
LD E, A ; Le multiplicande va dans E
LD H, B ; Le multiplicateur va dans H
LD B, 8 ; Traitement des 8 bits
_MATH_MUL_8x8_1
; Multiplication par 2 de HL (décalage d'1 bit vers le haut)
ADD HL, HL
JR nc, _MATH_MUL_8x8_2
; Remplacement du bit de débordement par le multiplicateur
ADD HL, DE
_MATH_MUL_8x8_2
DJNZ _MATH_MUL_8x8_1
POP DE ; restauration de DE
POP BC ; Restauration de BC
RET
|
5.1.2
Multiplication de deux entiers non signés de 16 par 8 bits, résultat
sur 16 bits
 |
|
;***************************************************************
; Routine de multiplication de 2 entiers non signés, de 16 par
; 8 bits, avec un résultat sur 16 bits
;
; En entrée :
; DE <=> Multiplicande
; A <=> Multiplicateur
; En sortie :
; HL <=> Produit de DE par A (résultat sur 16 bits !)
; Registres affectés
; F, HL
; Remarques
; - Si A ou DE = 0 => HL = 0 en sortie
; - A et DE sont préservés
;
MATH_MUL_16x8:
LD HL, 0 ; Valeur de retour
; Vérification des valeurs d'entrée
OR A
RET z
ADC HL, DE ; Ajout de DE à HL de manière à vérifier si DE = 0
RET z ; Si DE = 0 => z = 1
; Début du code lié à la multiplication
PUSH AC ; Préservation de AC
PUSH BC ; Préservation de BC
LD HL, 0 ; Valeur de retour
LD B, 8 ; Traitement des 8 bits
_MATH_MUL_16x8_1
; Multiplication par 2 de HL (décalage d'1 bit vers le haut)
ADD HL, HL
ADD A, A
JR nc, _MATH_MUL_16x8_2
; Remplacement du bit de débordement par le multiplicateur
ADD HL, DE
_MATH_MUL_16x8_2
DJNZ _MATH_MUL_16x8_1
POP BC ; Restauration de BC
POP AC ; Restauration de AC
RET
|
5.1.3
Multiplication de deux entiers non signés de 16 bits, résultat
sur 16 bits
 |
|
;***************************************************************
; Routine de multiplication de 2 entiers non signés de 16 bits,
; avec un résultat sur 16 bits
;
; En entrée :
; BC <=> Multiplicande
; DE <=> Multiplicateur
; En sortie :
; HL <=> Produit de BC par DE (résultat sur 16 bits !)
; Registres affectés
; F, HL
; Remarques
; - Si BC ou DE = 0 => HL = 0 en sortie
; - BC et DE sont préservés
;
MATH_MUL_16x16 :
LD HL, 0 ; Valeur de retour
; Vérification des valeurs en entrée
RL L ; Permet d'effacer Carry
ADC HL, BC ; Vérification que BC = 0
RET z
LD HL, 0
ADC HL, DE ; Vérification que DE = 0
RET z
; Début du code lié à la multiplication
PUSH AF ; Préservation de AF
PUSH BC ; Préservation de BC
LD HL, 0 ; Valeur de retour
LD A, B
LD B, 16
_MATH_MUL_16x16_1
; Multiplication par 2 de HL (décalage d'1 bit vers le haut)
ADD HL, HL
SLA C ; SLA suivi d’un RLA permet de réaffecter les bits de C
RLA ; dans A en cas de débordement de C, donc de traiter
; les 16 bits du multiplicateur
JR nc, _MATH_MUL_16x16_2
; Remplacement du bit de débordement par le multiplicateur
ADD HL, DE
_MATH_MUL_16x16_2
DJNZ _MATH_MUL_16x16_1
POP BC ; Restauration de BC
POP AF ; Restaurationde AF
RET
|
|
| 5.2
Les Multiplications par sous-produits |
|
5.2.1
Multiplication de deux entiers non signés de 8 bits, résultat
sur 16 bits
 |
|
;***************************************************************
; Routine de multiplication de 2 entiers non signés, de 8 bits
; avec un résultat sur 16 bits
;
; En entrée
; A <=> Multiplicateur
; B <=> Multiplicande
; En sortie
; HL <=> Produit
; Registres affectés
; F, HL
; Remarques
; - Si A ou B = 0 => HL = 0 en sortie
; - A et B sont préservés
; - Pour optimiser les calculs, vous pouvez vérifier que le
; multiplicateur est bien inférieur au multiplicande
;
MATH_MUL_8x8:
LD HL,0 ; Valeur pour le retour
; Vérification des valeurs en entrée
OR A ; Test de A
RET z ; Retour si A = 0
LD L, A ; Sauvegarde de A pour le test de B
LD A, B ; Transfert de B dans A pour le test
OR A ; Test de B via A
LD A, L ; On restore A
LD L, H ; On efface L via H
RET z ; Retour sir B = 0
_MATH_MUL_8x8_1
; Début du code lié à la multiplication
PUSH AF ; Préservation de AF pour le retour
PUSH DE ; On préserve DE pour le retour
LD D, L ; Le multiplicande est dans DE pour calculer les sous-produits
LD E, B ;
_MATH_MUL_8x8_2
BIT 0, A ; Vérification si le bit 0 = 0, si oui
; on ne cumule pas le sous-produit courant
JP Z, _MATH_MUL_8x8_3
ADD HL, DE ; Cumule du sous-produit courant
_MATH_MUL_8x8_3
EX HL,DE ; Décalage du sous-produit courant
ADD HL,HL ; de 1 bit vers le haut
EX HL,DE ;
SRL A ; Décalage du multiplicateur de 1 bit
; vers le bas
OR A ; Vérification que tous les bits du
; multiplicateur ont été traités
JP nz, _MATH_MUL_8x8_2
_MATH_MUL_8x8_END
POP DE ; Restauration de DE
POP AF ; Restauration de AF
RET
|
5.2.2
Multiplication de deux entiers non signés de 16 par 8 bits, résultat
sur 16 bits
 |
|
;***************************************************************
; Routine de multiplication de 2 entiers non signés, de 16 par
; 8 bits, avec un résultat sur 16 bits
;
; En entrée
; DE <=> Multiplicande
; A <=> Multiplicateur
; En sortie
; HL <=> Produit de DE x A (résultat sur 16 bits !)
; Registres affectés
; F, HL
; Remarques
; - Si De ou A = 0 => HL = 0 en sortie
; - DE et A sont préservés
; - Pour optimiser les calculs, vous pouvez vérifier que le
; multiplicateur est bien inférieur au multiplicande
;
MATH_MUL_16x8
LD HL,0 ; Mise à blanc de HL pour le retour
;Vérification des valeurs en entrée
OR A ; Si A = 0 on sort
RET z
ADC HL, DE ; Si DE = 0 on sort
RET z
; Début du code lié à la multiplication
PUSH AF ; Préservation de AF pour le retour
PUSH DE ; Préservation de DE pour le retour
LD HL, 0
_MATH_MUL_16x8_1
BIT 0, A ; Vérification si le bit 0 = 0, si oui
; on ne cumule pas le sous-produit courant
JP z, _MATH_MUL_16x8_3
ADD HL, DE ; Cumule du sous-produit courant
_MATH_MUL_16x8_3
EX HL,DE ; Décalage du sous-produit courant
ADD HL,HL ; de 1 bit vers le haut
EX HL,DE ;
SRL A ; Décalage du multiplicateur de 1 bit
; vers le bas
OR A ; Vérification que tous les bits du
; multiplicateur ont été traités
JP nz, _MATH_MUL_16x8_1
_MATH_MUL_16x8_END
POP DE ; Restauration de DE
POP AF ; Restauration de AF
RET
|
|
| 5.3
La division par utilisation de sous-dividendes |
|
5.3.1
Division de deux entiers non signés de 8 bits, résultat sur
8 bits
 |
|
;***************************************************************
; Routine de division de 2 entiers non signés de 8 bits, avec un
; résultat sur 8 bits
;
; En entrée
; A <=> Dividende
; B <=> Diviseur
; En sortie
; A <=> Quotient
; B <=> Reste de la division entière
; Registres affectés
; F, A , B
; Remarques
; - A et B sont détruits et remplacé respectivement par
; le quotient et le reste de la division
;
MATH_DIV_8x8:
PUSH DE ; Préservation de DE
LD D, A ; Le dividende et le diviseur sont stockés
LD E, B ; respectivement dans D et E
LD B, 8 ; Les 8 bits du dividende sont traités
XOR A, A
_MATH_DIV_8x8_1
SLA D ; Décalage du bit le plus haut, du dividende dans Carry
RLA ; Récupération de Carry dans le sous-dividende (A)
; (création du sous dividende)
CP E ; Vérification si le sous-dividende est supérieur ou
; égal au diviseur. Si oui le quotient = + 1, sinon on
; traite le bit suivant, du dividende
JR c, _MATH_DIV_8x8_2
INC D ; Incrémentation du quotient. Sachant que les bits de D
; sortent vers le haut (la gauche), les bits du bas vont
; servir pour stocker le quotient
SUB E ; On soustrait le diviseur du dividende
_MATH_DIV_8x8_2
DJNZ _MATH_DIV_8x8_1 ; Décrémentation de B de manière à
; à traiter les 8 bits du dividende
LD B, A ; Récupération du reste dans B
LD A, D ; Récupération du quotient calculé dans A
POP DE ; Restauration de DE
RET
|
5.3.2
Division de deux entiers non signé de 16 et 8 bits, résultat
sur 16 bits
 |
|
;***************************************************************
; Routine de division d’un entier non signé de 16 bits par un
; entier non signé de 8 bits, avec un résultat sur 16 bits
;
; En entrée
; BC <=> Dividende
; A <=> Diviseur
; En sortie
; BC <=> Quotient (sur 16 bits)
; A <=> Reste de la division entière
; Registres affectés
; F, BC, A
; Remarques
; - BC et A sont détruits et remplacé respectivement par
; le quotient et le reste de la division
;
MATH_DIV_16x8:
PUSH HL ; Préservation de HL
LD HL, BC ; Stockage du dividende dans HL
LD C, A ; Stockage du diviseur dans C
LD B, 16 ; Les 16 bits de HL (le dividende) vont être traités
XOR A, A
_MATH_DIV_16x8_1
SLA L ; Décalage du bit le plus haut, du dividende dans Carry
RL H
RLA ; Récupération de Carry dans le sous-dividende (A)
; (création du sous dividende)
CP C ; Vérification si le sous-dividende est supérieur ou
; égal au diviseur. Si oui le quotient = + 1, sinon on
; traite le bit suivant, du dividende
JR c, _MATH_DIV_16x8_2
INC HL ; Incrémentation du quotient (sachant que tous les bits
; de HL sont décalé vers le haut (la gauche), les bits
; venant du bas vont servir pour stocker le quotient
SUB C ; On soustrait le diviseur du dividende
_MATH_DIV_16x8_2
DJNZ _MATH_DIV_16x8_1 ; Décrémentation de B de manière à
; à traiter les 16 bits du dividende
LD B, H ; Récupération du quotient calculé dans HL
LD C, L ; Le reste se trouve dans A
POP HL ; Restauration de HL
RET
|
5.3.3
Division de deux entiers non signé de 16 bits, résultat sur
16 bits
 |
|
;***************************************************************
; Routine de division d’un entier non signé de 16 bits par un
; entier non signé de 16 bits, avec un résultat sur 16 bits
;
;En entrée
; BC <=> Dividende
; DE <=> Diviseur
;En sortie
; BC <=> Quotient
; DE <=> Reste de la division entière (sur 16 bits)
;Registres affectés
; BC, DE
; Remarques
; - BC et DE sont détruits et remplacé respectivement par
; le quotient et le reste de la division
;
MATH_DIV_16x16:
PUSH AF ; Préservation de AF
PUSH HL ; Préservation de HL
LD HL, 0 ; Servira de sous-dividende
LD A, B ; Stockage de la partie haute du diviseur dans A
LD B, 16 ; Les 16 bits de HL (le dividende) vont être traités
XOR A, A
_MATH_DIV_16x16_1
SLA C ; Décalage du bit le plus haut de la partie basse du
; dividende, dans Carry
RLA ; Récupération de Carry dans la partie haute du dividende
; Et décalage de la partie haute du dividende dans Carry
ADC HL, HL ; Récupération éventuelle de Carry et création par la
; même occasion du sous-dividende
SBC HL, DE ; On enlève le diviseur du sous-dividende, si Carry est
; allumé c’est que le sous-dividende est inférieur
JR c, _MATH_DIV_16x16_2
INC C ; Incrémentation de C de manière à crée le quotient
; (Remplacement des bits du dividende par le quotient)
DJNZ _MATH_DIV_16x16_1 ; Décrémentation de B de manière à
; traiter les 16 bits du dividende
JP _MATH_DIV_16x16_END ; Saut à la fin lorsque B=0
_MATH_DIV_16x16_2
ADD HL, DE ; Restauration du sous-dividende car celui-ci est
; inférieur au diviseur
DJNZ _MATH_DIV_16x16_1 ; Décrémentation de B de manière à
; traiter les 16 bits du dividende
_MATH_DIV_16x16_END
LD D, H ; Récupération du reste de la division dans DE
LD E, L
LD B, A ; Partie haute du quotient dans B
; La partie basse se trouve déjà dans C
POP HL ; Restauration de HL
POP AF ; Restauration de AF
RET
|
|
|