;---------------------------------------------------------------------- ;ADDITION de registres sur 3 octets ;r20,21,22:= r20,21,22 + r0,r1,r2 add24r: add r20,r0 adc r21,r1 adc r22,r2 ret ;---------------------------------------------------------------------- ;ADDITION sur 3 octets (1) ;r20,21,22:= r20,21,22 + nombre1 add24a: lds a,nombre1+0 add r20,a lds a,nombre1+1 adc r21,a lds a,nombre1+2 adc r22,a ret ;---------------------------------------------------------------------- ;ADDITION sur 3 octets (2) ;nombre1:= nombre1 +nombre2 add24b: push AA push BB lds AA,nombre1+0 lds BB,nombre2+0 add AA,BB sts nombre1+0,AA lds AA,nombre1+1 lds BB,nombre2+1 adc AA,BB sts nombre1+1,AA lds AA,nombre1+2 lds BB,nombre2+2 adc AA,BB sts nombre1+1,AA pop BB pop AA ret ;---------------------------------------------------------------------- ;MULTIPLICATION 8 bits x 16 bits resultat sur 24 bits ;multiplie r20(poids faible),r21 , r22(poids fort) par 'a' ;produit dans r20,r21,r22 .def produit0=r20 ;produit poids faible .def produit1=r21 ;produit .def produit2=r22 ;produit poids fort .def n1=r23 mul16_8: ldi n1,17 ;compteur de boucle mul16_81: ror produit2 ror produit1 ror produit0 brcc mul16_82 ;lecture d'un bit de r20 ; test de ce bit add produit2,a ;si c' est un '1' on ajoute 'a' à A2 mul16_82: dec n1 brne mul16_81 ret ;---------------------------------------------------------------------- ;DIVISION 24 bits par 8 bits, resultat sur 24 bits ;note; le quotient est stocke dans le dividende; permet de decaller les deux a la fois ;r20,21,22 doivent contenir le dividende (r20=LSB) ;r23 doit contenir le diviseur ;resultat (Quotient) dans r20 (LSB) et r21 et r22 ;reste dans r24 ;le bit T=1 indique un debordement .def Dividend0=r20 ;pour la routine Div24_8 .def Dividend1=r21 ;pour la routine Div24_8 .def Dividend2=r22 ;pour la routine Div24_8 .def Diviseur =r23 ;pour la routine Div24_8. .def Aux0=r24 ;pour la routine Div24_8 .def Aux1=r25 .def n1=r16 ;attention: ecrase r16 (=a) div24_8: ldi n1,24 clr Aux0 ;clrf Aux+0 div24_80: lsl Dividend0 rol Dividend1 rol Dividend2 div24_81: rol Aux0 ;decalle le dividende dans 'Aux' (passage d'un bit par "c") rol Aux1 cp aux0,Diviseur brlo auxPetit auxGrand: sub Aux0,Diviseur sec rjmp saut1 auxPetit: clc saut1: rol Dividend0 ;decalle a gauche en incorporant 'c' comme bit 0 rol Dividend1 ;decalle a gauche avec passage d'un bit par "c" rol Dividend2 ;decalle a gauche et envoie un bit par 'c' dans 'Aux' (apres le saut) dec n1 ;important: ne touche pas a 'c' brne Div24_81 ret ;---------------------------------------------------------------------- ;comparaison de deux valeurs codées sur 16 bits (AH,L à BH,L) (valeur positives seulement) ;l'instruction suivant l'appel peut etre un branchement conditionnel cp16: cp AH,BH breq cp2 ret cp2: cp AL,BL ret ;---------------------------------------------------------------------- ;incrementation 16 bits de AH,L inc16: inc AL brne fininc inc AH fininc: ret ;---------------------------------------------------------------------- ;decrementation 16 bits de AH,L dec16: subi AL,1 sbci AH,0 findec: ret