Porównywanie liczb wielobajtowych
From Atariki
| Wersja z dnia 00:04, 18 paź 2019 Mono (Dyskusja | wkład) (jeszcze =) ← 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ą: | Wykorzystując zmienną roboczą: | ||
| Linia 71: | Linia 101: | ||
| == 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 143: | 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
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.
