Temat: tips & tricks
Chciałem się podzielić pewnym spostrzeżeniem.
Nie odkryłem może niczego nowego, ale okazuje się że mając potrzebę wykonania takiego działania:
Y=X/(2^N-1)
można z powodzeniem zastosować takie przybliżenie:
Y=round(X+X/2^N)/2^N
Mnie zaoszczędziło to iteracji z dzieleniem dzięki czemu działanie Y=X/63 wykonuje się nie dwie linie CPU, a około jednej.
Edit: Na końcu przydaje się round (uzupełniłem).
Edit 2: A jakby ktoś chciał kawałek kodu, oto:
lda value
sta div64l
lda #0
sta div64h
lda value+1
asl div64l
rol
rol div64h
asl div64l
rol
rol div64h
adc value
sta div64l
div64h = *+1
lda #
adc value+1
asl div64l
rol
asl div64l
adc #0
value to 16-bit wartość wejściowa, w .A jest 8-bit wynik. Przedtem kod wyglądał tak:
lda value
sta result
lda value+1
ldx #8
?div:
cmp #63
scc
sbc #63
rol result
rol
dex
bne ?div
result = *+1
lda #
Obydwa kawałki kodu dzielą jeszcze wynik przez 2 (taką akurat miałem potrzebę).
Ostatnio edytowany przez mono (2014-07-28 12:30:50)
niewiedza buduje, wiedza rujnuje