Amit írsz, az ugyan működne, de annyira végtelenül gányolás, hogy szégyellném leírni a kódba. Teljesn általános a konverzióm. Nem szedem szét az egész és a törtrészt. Decimális alapon konvertálok. Az eddigi részeredményt kétszerezem, amelyet úgy csinálok, hogy hozzáadom a részeredményt önmagához. A binárist shiftelem balra kifelé. Ha 1-es bit pottyant ki, akkor hozzáadok a decimális részeredményhez 00000625-öt. Ha 0 pottyant ki, akkor meg nem. :)
A packed BCD összeadást pedig úgy csinálom, hogy a byte-on történő sima összeadást követően hozzáadok még 6-ot, ha digit carry volt, még 0x60-at, ha carry. Utána jön az, hogy megnézem, nem csordult-e „betűbe” a szám. Ezt úgy csinálom, hogy megint hozzáadok 6-ot, de az eredmény a W-ben keletkezik, s ha most digit carry lett, akkor nyilván betű volt, szóval akkor W-ből visszaírom az eredménybe ezt. Aztán hozzáadok 0x60-at újfent, eredmény a W-be, ha carry lett, akkor betű volt, szóval akkor mehet a W az eredménybe. Ami most keletkezett carry, azt hozzá kell OR-olni az elején lévő összeadás átviteléhez.
Az ASCII-vé konvertálásról nem írok, ott legfeljebb a '-' előjel a feladat, a bevezető nullák eldobása, persze úgy, hogy közvetlenül a tizedespont előtt maradjon egy, a tizedespont kiírása, valamint a végéről a felesleges 0-k leszedése, de az is úgy, hogy a pont után egy azért maradjon.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE