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 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 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'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*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 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 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... |
CPCrulez[Content Management System] v8.7-desktop/c Page créée en 459 millisecondes et consultée 1974 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. |
|
|