Porównywanie liczb wielobajtowych

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 00:06, 18 paź 2019
Mono (Dyskusja | wkład)
(jeszcze odnosnie C)
← Previous diff
Wersja z dnia 00:07, 18 paź 2019
Mono (Dyskusja | wkład)
(reorganizacja)
Next diff →
Linia 30: Linia 30:
</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).
 +
 +== 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 161: Linia 171:
<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]]

Wersja z dnia 00:07, 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).

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

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