Do i just do a normal subtraction, and watch the carry/zero flags, or is there a slicker way?
I mostly ask because whenever I do something, I invariably later see a method that is both better, and embarrassingly obvious.
Code: Select all
;16-bit number comparison...
;
lda #>x ;MSB of 1st number
cmp #>y ;MSB of 2nd number
bcc islower ;X < Y
;
bne ishigher ;X > Y
;
lda #<x ;LSB of 1st number
cmp #<y ;LSB of 2nd number
bcc islower ;X < Y
;
beq issame ;X = Y
;
bne ishigher ;X > YCode: Select all
lda I+1
cmp J+1
bne Decide
lda I
cmp J
Decide blo Lower
Code: Select all
LDA x+1
CMP y+1
BNE :+
LDA x+0
CMP y+0
: BCC lower
BNE higher
BEQ same
Code: Select all
lda addr0
cmp addr1
lda addr0+1
sbc addr1+1
bcc addr1IsBigger
bne addr0IsBigger
; else equal...
Code: Select all
BLT -> BCC ; Branch if Less Than
BGE -> BCS ; Branch if Greater than EqualCode: Select all
lda addr0
cmp addr1
lda addr0+1
sbc addr1+1
bcc addr1IsBigger
bne addr0IsBigger
; else equal...
Code: Select all
lda addr0
cmp addr1
lda addr0+1
sbc addr1+1
bcc addr1IsBigger
;addr0IsGreaterOrEqual
Code: Select all
; Compare two 32-bit values
NUMA = $4000 ; LSB for NUMA. Other bytes in NUMA+1, NUMA+2, NUMA+3
NUMB = $4004 ; like above
.compare_32bit
lda NUMA+3
cmp NUMB+3
bcc less_than ; NUMA < NUMB
bne more_than ; if NUMA+3 <> NUMB+3 then NUMA > NUMB
lda NUMA+2
cmp NUMB+2
bcc less_than
bne more_than
lda NUMA+1
cmp NUMB+1
bcc less_than
bne more_than
lda NUMA
cmp NUMB
bcc less_than
bne more_than
.equal
; stuff
.less_than
; stuff
.more_than
; stuff
rts