Porównywanie liczb wielobajtowych

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 23:44, 17 paź 2019
Mono (Dyskusja | wkład)
(powrownywanie liczb wielobajtowych)
← Previous diff
Aktualna wersja
Mono (Dyskusja | wkład)
(A ? B)
Linia 17: Linia 17:
... ...
and data+N and data+N
- cmp #$FF+ eor #$FF
</pre> </pre>
Znacznik Z=1 oznacza, że liczba jest równa $FF..FF. Znacznik Z=1 oznacza, że liczba jest równa $FF..FF.
Linia 23: Linia 23:
Zmieniając Zmieniając
<pre> <pre>
- cmp #$FF+ eor #$FF
</pre> </pre>
na na
<pre> <pre>
- cmp #$99+ eor #$99
</pre> </pre>
można również testować czy liczba BCD jest równa 99..99 (nie wymaga wcześniejszego ustawienia bitu D). można również testować czy liczba BCD jest równa 99..99 (nie wymaga wcześniejszego ustawienia bitu D).
 +
 +Metoda nie modyfikuje znacznika C.
 +
 +== Zgodność znaków liczb U2 ==
 +
 +Test polega na sprawdzeniu MSB argumentów:
 +<pre>
 + lda dataA+N
 + eor dataB+N
 +</pre>
 +* N=0 - znaki zgodne
 +* N=1 - znaki różne
== A=B == == A=B ==
Linia 49: Linia 61:
... ...
</pre> </pre>
-Działa też dla liczb U2 i BCD (nie wymaga wcześniejszego ustawienia bitu D).+lub
 +<pre>
 + lda dataA
 + eor dataB
 + bne rozne
 + lda dataA+1
 + eor dataB+1
 + bne rozne
 + ...
 + lda dataA+N
 + eor dataB+N
 + bne rozne
 +rowne:
 + ...
 +rozne:
 + ...
 +</pre>
 + 
 +Działa też dla liczb U2 i BCD (nie wymaga wcześniejszego ustawienia bitu D). Ostatnia wersja nie modyfikuje znacznika C.
 + 
 +Wykorzystując zmienną roboczą:
 +<pre>
 + lda dataA
 + eor dataB
 + sta temp
 + lda dataA+1
 + eor dataB+1
 + ora temp
 + sta temp
 + ...
 + lda dataA+N
 + eor dataB+N
 + ora temp
 +</pre>
 +Znacznik Z odpowiada za relacje = i <>
 +* Z=1 - A = B
 +* Z=0 - A <> B
 +Metoda nie modyfikuje znacznika C. Nadaje się do porównywania liczb BCD i U2.
== A ? B == == A ? B ==
 +Tradycyjna metoda porównywania liczb wielobajtowych
 +<pre>
 + lda dataA
 + cmp dataB
 + lda dataA+1
 + sbc dataB+1
 + ...
 + lda dataA+N
 + sbc dataB+N
 +</pre>
 +pozwala na testowanie wyłącznie relacji < i >=:
 +* C=0 - A < B
 +* C=1 - A >= B
 +
Porównując liczby od najstarszego bajtu można dokonać testu relacji <, =, > Porównując liczby od najstarszego bajtu można dokonać testu relacji <, =, >
<pre> <pre>
Linia 122: Linia 185:
Ta metoda również nadaje się do porównań liczb BCD (wymaga wcześniejszego ustawienia bitu D). Ta metoda również nadaje się do porównań liczb BCD (wymaga wcześniejszego ustawienia bitu D).
-== Zgodność znaków liczb U2 ==+<b>UWAGA</b>
 +W dwóch ostatnich przypadkach znacznik N ulega zniszczeniu przy ostatnim ORA TEMP, więc w przypadku porównywania liczb U2 można test na N wykonać wcześniej.
-Test polega na sprawdzeniu MSB argumentów:+[[Kategoria:Niezbędnik kodera]]
-<pre>+
- lda dataA+N+
- eor dataB+N+
-</pre>+
-* N=0 - znaki zgodne+
-* N=1 - znaki różne+

Aktualna wersja

Spis treści

Zero

  lda data
  ora data+1
  ...
  ora data+N

Znacznik Z=1 oznacza, że liczba jest równa 0. Ta metoda działa również w przypadku liczb BCD (nie wymaga wcześniejszego ustawienia bitu D).

MAX

  lda data
  and data+1
  ...
  and data+N
  eor #$FF

Znacznik Z=1 oznacza, że liczba jest równa $FF..FF.

Zmieniając

  eor #$FF

na

  eor #$99

można również testować czy liczba BCD jest równa 99..99 (nie wymaga wcześniejszego ustawienia bitu D).

Metoda nie modyfikuje znacznika C.

Zgodność znaków liczb U2

Test polega na sprawdzeniu MSB argumentów:

  lda dataA+N
  eor dataB+N
  • N=0 - znaki zgodne
  • N=1 - znaki różne

A=B

  lda dataA
  cmp dataB
  bne rozne
  lda dataA+1
  cmp dataB+1
  bne rozne
  ...
  lda dataA+N
  cmp dataB+N
  bne rozne
rowne:
  ...
rozne:
  ...

lub

  lda dataA
  eor dataB
  bne rozne
  lda dataA+1
  eor dataB+1
  bne rozne
  ...
  lda dataA+N
  eor dataB+N
  bne rozne
rowne:
  ...
rozne:
  ...

Działa też dla liczb U2 i BCD (nie wymaga wcześniejszego ustawienia bitu D). Ostatnia wersja nie modyfikuje znacznika C.

Wykorzystując zmienną roboczą:

  lda dataA
  eor dataB
  sta temp
  lda dataA+1
  eor dataB+1
  ora temp
  sta temp
  ...
  lda dataA+N
  eor dataB+N
  ora temp

Znacznik Z odpowiada za relacje = i <>

  • Z=1 - A = B
  • Z=0 - A <> B

Metoda nie modyfikuje znacznika C. Nadaje się do porównywania liczb BCD i U2.

A ? B

Tradycyjna metoda porównywania liczb wielobajtowych

  lda dataA
  cmp dataB
  lda dataA+1
  sbc dataB+1
  ...
  lda dataA+N
  sbc dataB+N

pozwala na testowanie wyłącznie relacji < i >=:

  • C=0 - A < B
  • C=1 - A >= B

Porównując liczby od najstarszego bajtu można dokonać testu relacji <, =, >

  lda dataA+N
  cmp dataB+N
  bcc mniejsze
  bne wieksze
  lda dataA+N-1
  cmp dataB+N-1
  bcc mniejsze
  bne wieksze
  ...
  lda dataA
  cmp dataB
  bcc mniejsze
  bne wieksze
rowne:
  ...
wieksze:
  ...
mniejsze:
  ...

Działa dla BCD (nie wymaga wcześniejszego ustawienia bitu D).

Wykorzystując zmienną roboczą można testować relacje <. =, >=, >:

  sec
  lda dataA
  sbc dataB
  sta temp
  lda dataA+1
  sbc dataB+1
  ora temp
  sta temp
  ...
  lda dataA+N
  sbc dataB+N
  ora temp

Znaczniki Z i C odpowiadają za relacje:

  • C=0 - A < B,
  • Z=1 - A = B,
  • C=1 - A >= B,
  • C=1 przy uprzednim wykluczeniu Z=1 - A > B.

Dodatkowo znacznik V odpowiada za przepełnienie przy porównywaniu liczb U2. Ta metoda nadaje się do porównań liczb BCD (wymaga wcześniejszego ustawienia bitu D).

Zamieniając miejscami argumenty można testować relacje >, =, <=

  sec
  lda dataB
  sbc dataA
  sta temp
  lda dataB+1
  sbc dataA+1
  ora temp
  sta temp
  ...
  lda dataB+N
  sbc dataA+N
  ora temp

gdzie analogicznie:

  • C=0 - A > B,
  • Z=1 - A = B,
  • C=1 - A <= B,
  • C=1 przy uprzednim wykluczeniu Z=1 - A < B.

Znacznik V odpowiada za przepełnienie przy porównywaniu liczb U2. Ta metoda również nadaje się do porównań liczb BCD (wymaga wcześniejszego ustawienia bitu D).

UWAGA W dwóch ostatnich przypadkach znacznik N ulega zniszczeniu przy ostatnim ORA TEMP, więc w przypadku porównywania liczb U2 można test na N wykonać wcześniej.

Personal tools