racimo1985
Messages postés13Date d'inscriptiondimanche 10 février 2008StatutMembreDernière intervention10 octobre 2008
-
6 sept. 2008 à 13:43
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
14 sept. 2008 à 12:53
Bonjour tt le monde, j besoin d'un algorithme qui montre le fonctionnement de l'instruction DAA, cette instruction se base sur la conversion BCD du nombre hexadécimale concerné comme expliqué ci-dessous :
Exemples : on veut faire l’addition en BCD de 73 + 88
On remarque que ni 1111 ni 1011 est un nombre BCD donc on va ajouter 6
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 6 sept. 2008 à 23:24
Type
TBCD4 = array[0..1] of byte; // for Byte
TBCD6 = array[0..2] of byte; // for Word
TBCD10 = array[0..4] of byte; // for LongWord
function BCDToSTR(const BCD: TBCD4): string; overload;
begin
SetLength(result, 3);
result[1] := char((BCD[0] and $F) or $30);
result[2] := char((BCD[1] shr 4) or $30);
result[3] := char((BCD[1] and $F) or $30);
end;
function BCDToSTR(const BCD: TBCD6): string; overload;
begin
SetLength(result, 5);
result[1] := char((BCD[0] and $F) or $30);
result[2] := char((BCD[1] shr 4) or $30);
result[3] := char((BCD[1] and $F) or $30);
result[4] := char((BCD[2] shr 4) or $30);
result[5] := char((BCD[2] and $F) or $30);
end;
function BCDToSTR(const BCD: TBCD10): string; overload;
begin
SetLength(result, 10);
result[1] := char((BCD[0] shr 4) or $30);
result[2] := char((BCD[0] and $F) or $30);
result[3] := char((BCD[1] shr 4) or $30);
result[4] := char((BCD[1] and $F) or $30);
result[5] := char((BCD[2] shr 4) or $30);
result[6] := char((BCD[2] and $F) or $30);
result[7] := char((BCD[3] shr 4) or $30);
result[8] := char((BCD[3] and $F) or $30);
result[9] := char((BCD[4] shr 4) or $30);
result[10]:= char((BCD[4] and $F) or $30);
end;
function StrCropZero(const S: string): string;
var C,I,L: integer;
begin
result := S;
C := 0;
I := 1;
L := Length(result);
while (result[I] = #48) and (I < L) do
begin
inc(C);
inc(I);
end;
if C > 0 then
Delete(result, 1, C);
end;
function ByteToBCD(const Num: Byte): TBCD4;
begin
result[1] := (Num mod 10) or
((Num div 10 mod 10) shl 4);
result[0] := Num div 100 mod 10;
end;
function WordToBCD(const Num: Word): TBCD6;
begin
result[2] := (Num mod 10) or
((Num div 10 mod 10) shl 4);
result[1] := (Num div 100 mod 10) or
((Num div 1000 mod 10) shl 4);
result[0] := Num div 10000 mod 10;
end;
function LongWordToBCD(const Num: LongWord): TBCD10;
begin
result[4] := (Num mod 10) or
((Num div 10 mod 10) shl 4);
result[3] := (Num div 100 mod 10) or
((Num div 1000 mod 10) shl 4);
result[2] := (Num div 10000 mod 10) or
((Num div 100000 mod 10) shl 4);
result[1] := (Num div 1000000 mod 10) or
((Num div 10000000 mod 10) shl 4);
result[0] := (Num div 100000000 mod 10) or
((Num div 1000000000 mod 10) shl 4);
end;
function BCDToByte(const BCD: TBCD4): byte;
begin
result := (BCD[1] and $F)
+ ((BCD[1] shr 4)*10)
+ ((BCD[0] and $F)*100);
end;
function BCDToWord(const BCD: TBCD6): Word;
begin
result := (BCD[2] and $F)
+ ((BCD[2] shr 4) *10)
+ ((BCD[1] and $F)*100)
+ ((BCD[1] shr 4) *1000)
+ ((BCD[0] and $F)*10000);
end;
function BCDToLongWord(const BCD: TBCD10): LongWord;
begin
result := (BCD[4] and $F)
+ ((BCD[4] shr 4) *10)
+ ((BCD[3] and $F)*100)
+ ((BCD[3] shr 4) *1000)
+ ((BCD[2] and $F)*10000)
+ ((BCD[2] shr 4) *100000)
+ ((BCD[1] and $F)*1000000)
+ ((BCD[1] shr 4) *10000000)
+ ((BCD[0] and $F)*100000000)
+ ((BCD[0] shr 4) *1000000000);
end;
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 9 sept. 2008 à 21:24
BCDToSTR permet d'afficher le BCD dans un label par exemple.
il est vrai que je n'ai pas fait de fonction STRToBCD...
mais tu peu probablement en faire une facilement a partir de mon code. c'est même surrement la fonction la plus simple a faire ...
pour convertir les BCD utilise BCDTo* vers le format de ton choix.
inversement, pour convertir un truc, utilise les *ToBCD ...
ou si tu recupere un BCD d'une source quelconque :
tu le place dans une variable type TBCD4, 6 ou 10 selon la taille désiré, avec move ou copymemory.
ou en transtypant directement si la source est compatible :
MonBCD := TBCD10( VariableCardinal ); // par exemple
racimo1985
Messages postés13Date d'inscriptiondimanche 10 février 2008StatutMembreDernière intervention10 octobre 2008 7 sept. 2008 à 11:38
Bjr! merci d'avoir répondu à mon appelle, ton algo est très instructif (top génial), le problème c : où je dois insérer la donnée hexa que je veux la convertir en BCD (j'ai pas pu trouver le lien directe entre str et word, longword, byte!!type incompatible). MERCI!
Vous n’avez pas trouvé la réponse que vous recherchez ?