Porównywanie liczb wielobajtowych
From Atariki
Wersja z dnia 23:44, 17 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).
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).
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