Porównywanie liczb wielobajtowych: Różnice pomiędzy wersjami

Z Atariki
Przejdź do nawigacji Przejdź do wyszukiwania
Mono (dyskusja | edycje)
m N przy U2
Mono (dyskusja | edycje)
 
(Nie pokazano 4 pośrednich wersji utworzonych przez tego samego użytkownika)
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 124: Linia 187:
<b>UWAGA</b>
<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.
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.
== 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


[[Kategoria:Niezbędnik kodera]]
[[Kategoria:Niezbędnik kodera]]

Aktualna wersja z 18 paź 2019, 03:04

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.