#include "avrtest.h" #define _PRINT ; maximale Stellenzahl der Fibinacci-Zahlen (1..255) maxDigits = 80 ; High-Byte der Speicheradresse der Arrays A und B pageA = 0x01 pageB = 0x02 ; Registerbelegung tmp = 16 count = 17 digit0 = 18 digit1 = 19 nDigits = 20 minus10 = 21 pageXor = 22 arg0 = 24 arg1 = 25 ; I/O-Adressen SREG = 0x3f start: ; A=0 clr XL ldi XH, pageA ldi digit0, '0' ldi count, maxDigits 0: st X+, digit0 #ifdef PRINT mov arg0, digit0 AVRTEST_PUTCHAR #endif dec count brne 0b #ifdef PRINT ; Ausgabe fib(0) ldi arg0, '\n' AVRTEST_PUTCHAR #endif ; B=1 clr XL ldi XH, pageB ldi digit0, '0' ldi count, maxDigits-1 0: st X+, digit0 dec count brne 0b ldi digit0, '1' st X, digit0 ; weitere Initialisierungen ldi minus10, -('9'+1) ldi pageXor, pageA ^ pageB ; zu berechnende Stellenzahl festlegen, anfangs reicht 1, mit größer ; werdenden Zahlen wird ndigits entsprechend angepasst ldi nDigits, 1 ; X zeigt auf A, Y auf B ldi XH, pageA ldi YH, pageB ; Schleife über alle Fibonacci-Zahlen loop: ldi XL, maxDigits ldi YL, maxDigits clc mov count, nDigits ; Schleife über alle Ziffern 0: ld digit0, -X ld digit1, -Y ; ASCII-Ziffern addieren adc digit0, digit1 subi digit0, '0' ; probeweise 10 subtrahieren, um ggf. Übetrag festzustellen mov tmp, digit0 add tmp, minus10 brcc 1f ; Übertrag behandeln mov digit0, tmp ori digit0, '0' 1: st X, digit0 dec count brne 0b #ifdef PRINT ; Ausgabe fib(i) in tmp, SREG clr ZL mov ZH, YH ldi count, maxDigits 0: ld arg0, Z+ AVRTEST_PUTCHAR dec count brne 0b ldi arg0, '\n' AVRTEST_PUTCHAR out SREG, tmp #endif ; falls nach der Berechnung der Zahl ein Übertrag verbleibt brcc 0f ; beim Erreichen der maximalen Stellenzahl Programm beenden cpi nDigits, maxDigits breq exit ; sonst Stellenzahl vergößern inc nDigits ; und den Übertrag in die nächsthöhere Ziffer schreiben ldi digit0, '1' st -X, digit0 0: ; Zeiger auf A und B vertauschen eor XH, pageXor eor YH, pageXor rjmp loop exit: clr arg0 clr arg1 AVRTEST_EXIT