;************************************************************************************************************************************* ; Subroutine year_transform wandelt eine 4 stellige Zahl in 2 dezimale Komponenten ; z.B. 3456 --> "34" und "56" ; Parameter: ; in: r18 = Low-Teil(X) ; r19 = High-Teil(X) ; out: r18 = Zehner/Einer(X) ; r19 = Tausender/Hunderter(X) year_transform: push r16 push r17 push r20 clr r16 clr r17 rjmp year_transform_02 ; Die Tausenderstelle soll erst nach dem ersten Subtraktionsdurchlauf inkrementiert werden year_transform_01: inc r16 ; nach jeder Subtraktion ohne Bereichsunterschreitung, wird r16, die "1000er" erhöht year_transform_02: subi r18, Low(1000) ; ziehe den Low-Teil von 1000 vom Low-Teil des Eingangswertes ab sbci r19, High(1000) ; ziehe den High-Teil von 1000 inkl. Übertrag vom High-Teil des Eingangswertes ab brcc year_transform_01 subi r18, Low(-1000) ; addiere zum Low-Teil den zu viel abgezogenen Low-Teil von 1000 sbci r19, High(-1000) ; addiere zum High-Teil den zu viel abgezogenen High-Teil von 1000 rjmp year_transform_04 ; Die Hunderterstelle soll erst nach dem ersten Subtraktionsdurchlauf inkrementiert werden ; r18:r19 enthalten nun den Rest, der kleiner 1000 ist year_transform_03: inc r17 ; nach jeder Subtraktion ohne Bereichsunterschreitung, wird r17, die "100er" erhöht year_transform_04: subi r18, Low(100) ;$/$ ; ziehe 100 vom Low-Teil des Rest, der kleiner 1000 ist, ab sbci r19, High(100) ;697 ; gab es im Low-Teil eine Bereichsunterschreitung, High-Teil - Übertrag brcc year_transform_03 subi r18, -100 ; addiere zum verbleibenden Rest die zu viel abgezogenen 100 wieder hinzu ; Register r19 hat am Ende dieses Durchlaufs den Wert 0 ; der verbleibende Zahlenwert ist kleiner 100 und nur in r18 gespeichert ; r18 enthält somit schon die Zehner und Einer in Form einer 2stelligen Dezimalzahl ldi r20, 10 mul r16, r20 ; multipliziere r16 (die 1000erStelle) mit 10 add r16, r17 ; addiere die 1000erStelle (*10) mit der 100erStelle --> 2Stellige Dezimalzahl mov r19, r16 ; kopiere die 1000er+100er 2erDezimalstelle in das ursprüngliche Register r19 pop r20 pop r17 pop r18 ret ;*************************************************************************************************************************************