Gast
#186219
Hi! Habe ein paar "kleine" Routinen zur Ausgabe von Binärzahlen in den größen 8, 16, 24 und 32Bit in ASM entwickelt. Die Routinen beherschen die sogenannte "Print Using"-Funktion, also das bei Ausgabe z. B. einer 16Bit-Zahl die Anzahl der Stellen von 5 bei Werten von 0 bis 65535 immer gleich bleibt. Dabei werden führene Nullen (0) durch Leerzeichen ersetzt. Durch setzen von Bit 4 im Register BCDFlag läßt sich das auch abschalten und eine 3 benutzt dann nur eine und 123 benötigt dann 3 Stellen. Desweiteren kann man in BCDFlag im unteren Nibble die Anzahl der Kommastellen angeben was ja in ASM ohne Float-Routinen recht schwer ist. Möchte man z. B. eine Binärzahl mit 4 Stellen (0-9999) ausgeben wo bei die unteren 2 Stellen die Kommastellen sind lädt man in BCDFlag einfach 2 und ruft die Routine PrintBCD16 auf. Man kann auch mit Ausgabe einer 32Bit-Zahl 9 Kommastellen festlegen ist aber eher Unsinn und ginge dann auch nur bis 4,294967295. Parameter: In Register Z übergibt man die Adresse der Binärzahl im SRAM. In Register BCDFlag (r19) an Bit 4 ob Print Using an (0) oder aus sein soll (1) und im unteren Nibble die Anzahl der Kommastellen von 0 (keine) bis 2, 4, 7 oder 9 (je nachdem, welche BCD-Funktion aufgerufen wird). Ein paar Beispiele: Ausgabe einer 16Bit Zahl wobei die unteren beiden Ziffern als "Kommastelle" fungieren: ldiwz BCDZahl ;macro ist in "BCD-Macros.inc" im Anhang. ldi BCDFlag,0x02 ;Print Using an und 2 Kommastellen. rcall PrintBCD16 ;Binärzahl ausgeben. .dseg BCDZahl .byte 2 Ausgabe einer 24Bit Zahl wobei die unteren 3 Ziffern als "Kommastelle" fungieren und ohne "Print Using": ldiwz BCDZahl ;macro ist in "BCD-Macros.inc" im Anhang. ldi BCDFlag,0x13 ;Print Using aus und 3 Kommastellen. rcall PrintBCD24 ;Binärzahl ausgeben. .dseg BCDZahl .byte 3 Die Routinen PrintBCD8, ...16 ...24 sind abhängig von PrintBCD32 da dort entsprechende Einsprungpunkte sind wegen der Code-Effezience. Eine Routine wie "PrintCode" muß von euch enthalten sein da ich euch meine nicht unbedingt aufzwängen will (geht über einen LCD-Buffer mit Verschiebung der Spalte zum Text rollen). Diese muß einfach nur auf irgend eine Art und Weise ein Zeichen auf dem LCD oder in euren LCD-Buffer ausgeben können. Es ist noch darauf zu achten, das Ihr vor dem Aufruf einer der BCD-Routinen in eurem LCD oder LCD-Buffer-Routinen noch die Anfangsposition der BCD-Ausgabe festlegen müßt. Eure PrintCode-Routine sollte, wenn mit Buffer im SRAM, auch die Spalten-Nr. erhöhen. Falls es Register-Konflickte gibt, sind die leicht in dem .def-Abschnitt änderbar. Nur r18, was bei mir ein unbenutztes "Vielzweckregister" ist, muß man bei der Routine PrintBCD32 anpassen wenn erfoderlich. Gruß Andi