13.12.2010, 11:49 AM
Wie wandelt man long-Werte in zig Stellen BCD-ASCII um, wenn der kostnix-Compiler die long-Bearbeitung unterbindet? Die I-Net-Gemeinde hilft...
(Source bei mir auf dem Schirm wunderschön eingerückt... )
(Source bei mir auf dem Schirm wunderschön eingerückt... )
Code:
//============================================================================
// Quadruple Precision (32-bit) unsigned Binary to BCD conversion
// bcd9 to bcd0 comprise one ten digit unpacked Binary-Coded-Decimal number.
// The upper nibble of each digit is zero (00008421). bcd9 is the MS-Digit.
// lval3 to lval0 comprise a four-byte (32-bit) binary accumulator.
// lval3 is the MS-Byte.
// The 32-bit binary number in lval in converted to a ten digit BCD number.
// Anm.: für andere Bit- und Ditit-Anzahlen nur die Arrays umdimensionieren.
// Quelle: http://www.piclist.com/techref/member/BB-LTL-/index.htm
unsigned char lval[4], bcd[10];
void ltoa(void)
{
unsigned char digcnt = sizeof(bcd);
FSR = bcd; // bcd-array löschen
do {
INDF = 0; // pic-pointer nehmen
FSR++; // pointer weiterstellen
} while(--digcnt); // alle digits abarbeiten
unsigned char bitcnt = sizeof(lval) * 8; // algorithmus aus der quelle
do {
lval[0] = rl(lval[0]); // Shift 32-bit accumulator
lval[1] = rl(lval[1]); // left to
lval[2] = rl(lval[2]); // put ms-bit
lval[3] = rl(lval[3]); // into Carry
FSR = bcd; // Point to address of least significant bcd digit
digcnt = sizeof(bcd); // inner loop digit counter
do {
INDF = rl(INDF); // Shift Carry into bcd digit
W = INDF - 10; // Subtract ten from digit then
// check and adjust for decimal overflow
if(Carry) INDF = W; // If Carry = 1 (result >= 0)
// adjust for decimal overflow
FSR++; // Point to next bcd digit
} while(--digcnt); // Decrement digit counter
} while(--bitcnt); // Decrement bit counter
digcnt = sizeof(bcd);
FSR = bcd; // bcd-array in ascii umwandeln
do {
INDF += '0'; // pic-pointer nehmen
FSR++; // pinter weiterstellen
} while(--digcnt); // alle digits abarbeiten
}