.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
|
|
|