Source file: /~heha/basteln/Haus/Telefon/CLIP-Anzeige/clip.zip/sqrt24.S

.def RL = r2	;Radikand (24 bit), Datenquelle
.def RM = r3
.def RH = r4
.def AL = r12	;Akku (14 bit), Rest (13bit) am Ende
.def AH = r13
.def WL = r18	;Ungerade Doppelwurzel (13bit), Wurzel (12bit) am Ende
.def WH = r19
.def LoopCounter = r17	;Schleifenzähler

;ca. 280 Takte (17,5 µs @ 16 MHz)
Wurzel:
;Doppelwurzel = 0 (LSB wird sowieso gesetzt)
	clr	WL
	clr	WH
;Akku löschen
	clr	AL
	clr	AH

	ldi	LoopCounter,12	;Für jedes Ergebnis-Bit eine Runde
zieh:
;Doppelwurzel "verdoppeln"
	sec
	rol	WL	;[xxxxx1 -> xxxxx01]
	rol	WH
	cbr	WL,2
;Zwei Bits aus Radikand in Akku schieben
	lsl	RL
	rol	RM
	rol	RH
	rol	AL
	rol	AH
	lsl	RL
	rol	RM
	rol	RH
	rol	AL
	rol	AH
;	brcs	setbit	;auskommentieren für 22/30-bit-Radikand
;Akku mit Doppelwurzel vergleichen
	cp	AL,WL
	cpc	AH,WH
	brcs	okay
setbit:
;Doppelwurzel vom Akku abziehen
	sub	AL,WL
	sbc	AH,WH
;Doppelwurzel+=2
	sbr	WL,2	;[xxxxx01 -> xxxxx11]
okay:
;nächste Runde
	dec	LoopCounter
	brne	zieh
;Doppelwurzel halbieren
	lsr	WH
	ror	WL
;fertig
	ret
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded