Porównywanie liczb wielobajtowych

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 23:53, 17 paź 2019
Mono (Dyskusja | wkład)
(N przy U2)
← Previous diff
Wersja z dnia 00:04, 18 paź 2019
Mono (Dyskusja | wkład)
(jeszcze =)
Next diff →
Linia 50: Linia 50:
</pre> </pre>
Działa też dla liczb U2 i BCD (nie wymaga wcześniejszego ustawienia bitu D). Działa też dla liczb U2 i BCD (nie wymaga wcześniejszego ustawienia bitu D).
 +
 +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 ==

Wersja z dnia 00:04, 18 paź 2019

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
  cmp #$FF

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

Zmieniając

  cmp #$FF

na

  cmp #$99

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

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

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

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

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.

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
Personal tools