1 Ostatnio edytowany przez mono (2014-07-28 12:30:50)

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

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

2

To samo dotyczy

Y=X/(2^N+1)

więc

Y=round(X-X/2^N)/2^N

Czyli dzielenie X/65 też będzie działać ładnie (i pewnie da się to uogólnić tylko ja nieuk jestem).

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

3

A przeglądając rzeczy do 7800 natrafiłem na taką oto stronę: http://7800.8bitdev.org/index.php/6502_Advanced_Tips
Polecam szybkie testowanie zakresów i dzielenia przez 2..32.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

4

Złota łopata to chyba niedomówienie ;)
A temat ciekawy, nawet zacząłem się zastanawiać jaki trudny byłby algorytm, który wygenerowałby optymalne procedury dzielenie dla konkretnych dzielników i póki co nie mam pojęcia.