;*********************************************************************** ;Algorithmus: ; ; R = Zahl ; ; P = -1 ; ; P=P+2 ; R=R-P ; bis r<0 ; ; Ergebnis = (P-1)/2 ;*********************************************************************** ; ; INPUT r17 (LOW) ; INPUT r18 ; INPUT r19 ; INPUT r20 (HIGH) ; OUTPUT r17 (LOW) ; OUTPUT r18 (HIGH) ; ; Hilfsregister: r21,r24,r25,r26,r27 ; ; (r)call SQRT32; INP: r17...r20 OUT: r17,r18 ; ; .macro SQRT ; ldi r17, BYTE1(@0) ; ldi r18, BYTE2(@0) ; ldi r19, BYTE3(@0) ; ldi r20, BYTE4(@0) ; (r)call SQRT32 ; .endmacro ; ; Aufruf: SQRT 10000 sqrt32: push r21 push r24 push r25 push r26 push r27 ldi r24, BYTE1(-1) ldi r25, BYTE2(-1) ldi r26, BYTE3(-1) ldi r27, BYTE4(-1) ; P=-1 clr r21 ; Null für sbc sqrt32_10: adiw r25:r24,2 adc r26,r21 adc r27,r21 ; P=P+2 sub r17,r24 sbc r18,r25 sbc r19,r26 sbc r20,r27 ; R=R-P brcc sqrt32_10 ; R>=0 ? sbiw r25:r24,1 sbc r26,r21 ; P=P-1 lsr r26 ror r25 ror r24 ; P=P/2 mov r17,r24 mov r18,r25 clr r19 clr r20 pop r27 pop r26 pop r25 pop r24 pop r21 ret