Wie schon in den vorhergehenden Unterabschnitten dieses Bereiches mehrfach erwähnt, stellen Konventionen eine gute Methode dar, um Fehlerhäufigkeit oder Verwechslungen beim Programmierer oder Programmnutzer zu vermindern. Dies wurde auch in der Namensvergabe von Unterprogrammen und Makros konsequent eingesetzt. Als Beispiel seien hier die LCD-Ausgaberoutinen angeführt, analoge Mechanismen wurden auch in anderen Bereichen verwendet.
Die Ausgabe von Informationen auf das LCD-Display ist, bezogen auf
die Prozessorzeit, eine sehr aufwändige Operation. Es ist somit sinnvoll,
mehrere Zeichen in einer -Ausgaberoutine auszugeben, ohne
den Bus neu initialisieren zu müssen. Es gibt jedoch auch zahlreiche
Situationen, in denen man um eine Bus-Initialisierung nicht herumkommt.
Daher sind diese ,,High-Level'' Ausgabefunktionen alle zwei mal vorhanden,
; ==================================================================
; display Z-value as floating point number - without LCD_INIT
; float format: NNN.F - in current implementation the fractional
; float part F can only be 0 or 5 (0.5 degrees),
; ----------------------------------
; input: REG_Z (word) in 0.5 degrees (=value*2)
; output: none
; affected: iic_sendbyte
;
LCD_SEND_CFLOAT:
push temp1
push ltmp1
PUSHW REG_Z
... assembler code ...
; do clean up ...
POPW REG_Z
pop ltmp1
pop temp1
ret
; ----------------------------------
; display Z-value as floating point number - with LCD_INIT
; ...
LCDINIT_SEND_CFLOAT:
rcall LCD_START ; start bus transfer
rcall LCD_SEND_CFLOAT ; send float to LCD
rcall IIC_STOP ; stop bus transfer
ret
Weitere häufig verwendete Konventionen bestehen darin, dass in zahlreichen
Subroutines ein Label mit dem Namen des Unterprogramms aufscheint,
dem die Nachsilbe ,,_ret'' nachgestellt ist. Dies ist
jenes Label, nach dem nur mehr Stack-Wiederherstellungen ausgeführt
werden und das somit jederzeit gefahrlos zum Verlassen des Unterprogramms
angesprungen werden kann, bzw. soll.
; ----------------------------------
; user selectable preset rotation direction
; ---------------------------------
; input: none
; output: temp1 - rotation step counter increment (-1,0,+1)
; affected: flags
; ---------------------------------
user_select_direction:
PUSHW REG_Z
... assembler code ...
dir_none:
ldi temp1, ValueDirNone ; no rotation?
rjmp user_select_direction_ret
dir_left:
ldi temp1, ValueDirDecr ; reverse direction
rjmp user_select_direction_ret
dir_right:
ldi temp1, ValueDirIncr ; normal direction
; rjmp user_select_direction_ret
user_select_direction_ret:
POPW REG_Z
tst temp1
ret
Weiters enden alle Hauptfunktionen der obersten Menüebene (Module)
mit der Nachsilbe ,,_main'' und können daher leicht als
Einsprungspunkte der Hauptfunktionen identifiziert werden.
Die häufige Verwendung der 16-Bit Makros führt zwangsweise auch dazu, dass zwei 8-Bit Register gemeinsam auf den Stack gesichert und vor allem in der richtigen Reihenfolge wiederhergestellt werden müssen.
Dies erledigen die beiden Makros PUSHW und POPW, die sich immer auf einen High- und Low-Registeranteil beziehen und somit auf alle Register angewendet werden können, die das H- und L-Postfix verwenden.
Diese ,,Typkennzeichnung'' wird aber auch bei 8-Bit Makros verwendet, so gibt das Makro OUTB ein Byte in ein 8-Bit Port unter Verwendung eines Hilfsregisters aus.
OUTB TIMSK,(1<<OCIE1A)|(1<<TOIE0)