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*5Meuh 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 8Ajouter 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 RETUne 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 RETIL FAILLIT L'ECARTERPrenons 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*YIl n'y a que des quartets à multiplier. Pour se faire, on va créer une table (à une adresse multiple de 100, comme A000), sous BASICFOR 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 123Hum, 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
| ★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser... |
|
|