CODINGAMSLIVE ★ AMSLIVE N°05 - MULTIPLICATION DE SOLUTIONS ★

AMSLIVE n°05 - Multiplication de SolutionsCoding Amslive
Qu'est-ce à dire ? De la concurrence, involentaire certes mais quand même, dans un fanzine à grand tirage ?!? On y décortique des opérations arithmétiques sur deux pages A4 et on propose une compacte routine de multiplication !?!

Qu'à cela ne tienne, je vous offre 2 autres alternatives, encore plus compactes (en mémoire et/ou en temps machine).

DISTRIBUTION GRATUITE

Ce mur de briques illustre le principe de la distributivité :

5*9-5* (4 + 5) = 5*4+5*5

Meuh non, je ne vous prends pas pour des imbéciles.
Soit le nombre 13, on l'écrit en binaire (00001101) pour en déduire que multiplier
par 13 revient à ajouter les produits des multiplications par 8, 4 et 1.
Maintenant, examinons le code suivant :


1
ADD HL,HL
2
ADD HL,HL
3
ADD HL,HL
4
ADD HL,HL
5
ADD HL.HL
6
ADD HL,HL
7
ADD HL,HL
8


Ajouter HL à lui-même revient à le multiplier par 2. Si on lui ajoute quelquechose (DE par exemple !) en position 7, DE sera concerné par le dernier ADD HL,HL : il sera en fait ajouté 2 fois. En position 6, 4 fois ... et en position 1, 128 fois.

Pour ajouter 13 fois DE, il faut donc placer ADD HL,DE en 5, 6 et 8.

Si vous avez suivi, vous comprendrez sans mal la routine suivante :

LD B,7 ;Poids max: 2^7 = 128
MULTI_LP RLA ;Poids décroissants
JR NC,NOADD1
ADD HL,DE
NOADD1 ADD HL,HL
DJNZ MULTI_LP
RLA ;Par contre 8 bits à tester
RET NC
ADD HL,DE
RET

Une astuce au passage pour les utilisateurs de DAMS qui veulent recopier la routine pour économiser le registre B et du temps machine. Plutôt que d'avoir 8 labels à numéroter, utilisez le terme $ qui représente la valeur en cours du compteur d'adresse.

RLA
JR NC,$+3
ADD HL,DE
ADD HL,HL
RLA
JR NC,$+3
...
JR NC,$+3
ADD HL,DE
RET

IL FAILLIT L'ECARTER

Prenons 2 valeurs 8 bits s'écrivant MN et XY (attention tous les nombres sont exprimés on hexa). Leur produit vaut

MN * XY = (M*10 + N) *(X*10 + Y)
= M*X*100 + M*Y*10 + N*X*10+N*Y

Il n'y a que des quartets à multiplier.
Pour se faire, on va créer une table (à une adresse multiple de 100, comme A000), sous BASIC

FOR x%=0 TO &FF:POKE &A000+x%,(x% AND 15)*(x% 16):NEXT

(pensez au MEMORY)

...ou avec la routine précédante. Cette table associe à un nombre 8 bits le produit de ses quartets (résultat sur 8 bits, puisque le maximum est F*F - E1). Exemple : &X01101000 donnera 30 (6 * 8).

DES QUARTETS, PASCAL

RRD et RLD offrent une manipulation aisée des quartets.

Ces 2 instructions travaillent avec A et le contenu de l'adresse que pointe HL. On considérera que ce sont nos deux opérandes. A=MN et (HL)=XY

Pour utiliser notre table, il faut regrouper les quartets MX, MY, NX et NY.

Voilà la routine, voili la route, Anne.

LD A,NOMBRET ;Une opérande à préciser
LD HL,ANOMBRE2 ;L'adresse de l'autre opérande
RRD
LD B,A ;B = MY
LD C,(HL) ;C = NX
RRD ;A = MX
LD L,(HL) ;L = YN
LD H,TABLE/#100 ;Mettre ici l'adresse de la table
LD E,(HL) ;E = Y*N = N*Y
LD L,A
LD D,(HL) ;D = M*X
LD L,B
LD A,(HL) ;A = M*Y
LD L,C
ADD A,(HL) ;A - M*Y + N*X
LD H,0
RL H ;On récupère la retenue
RLA ;On met les quartets
RL H ;dans le bon ordre.
RLA ;Comme H=0 au départ,
RL H ;carry est mis à zéro,
RLA ;et le LSQ de A
RL H ;sera bien nul
RLA
RL H
LD L,A
ADD HL,DE
RET
ANOMBRE2 DEFB 123

Hum, avec 48 µs, cette routine n'est pas si rapide que ça. Mais elle a le mérite d'avoir une durée d'éxecution constante. Vous pouvez l'accélérer en ajoutant des tables qui donneront directement les quartets dans les bonnes positions.

Mad rame , AMSLIVE n°5

★ ANNÉE: 1998
★ AUTEUR: MADRAM

Page précédente : AMSLIVE n°05 - CPC Sos Partie 1

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » AMSLIVE n°04 - Asic - Scrollhard
» Coding » AMSLIVE n°14 - 3D est-ce l'amour ?
» Coding » AMSLIVE n°16 - CRTC Detection
» Coding » AMSLIVE n°12 - Vu Metre
» Coding » AMSLIVE n°14 - Multiplication Saignee a Mort
» Coding » AMSLIVE n°15 - YM FAIT DU SKI
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.7-desktop/c
Page créée en 732 millisecondes et consultée 1973 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.