;; Can use A as b_low!
;; And X or Y is b_hi
;; Can add ", !" to the end for it to run faster but C=0 is not garantied!
.macro Add_16 a_low, a_hi, b_low, b_hi, fast_unsafe  ; a = a + b
;; IF to run it fast
.ifblank fast_unsafe
    CLC
.endif
;; If b_low != A
.if .match(.mid (0, 1, {b_low}), A )
.elseif .match(.mid (0, 1, {b_low}), X)
LDX
kssk
.match(.mid (0, 1, {b_low}), Y)
LDY
kkdkd
.else
    LDA b_low
.endif
	LDA b_low
	ADC a_low
	STA a_low
	LDA b_hi
.if .match(.mid (0, 1, {b_low}), X )
	LDX
	kdkdkd
.elseif .match(.mid (0, 1, {b_low}), Y )
	LDY
	dkkdk
.else
    LDA b_hi
.endif
	ADC a_hi
	STA a_hi
.endmacro


.macro Sub_16 a_low, a_hi, b_low, b_hi, fast_unsafe ; a = a - b
.ifblank fast_unsafe
    SEC
.endif
    LDA a_low
    SBC b_low
    STA a_low
    LDA a_hi
    SBC b_hi
    STA a_hi
.endmacro

.macro mult_16 low_, hi_, fast_unsafe  ; [low, hi] = [low, hi]*2
;; IF to run it fast
.ifblank fast_unsafe
    CLC
.endif
	ROL low_
	ROL hi_
.endmacro
;;Se below for some fast 16bit logic
;;http://6502.org/tutorials/compare_beyond.html

;; exampel 4.1.1
;;Larger then operation. IF a < b then jump to label
.macro Lag_16 a_low, a_hi, b_low, b_hi, label ; [low, hi] = [low, hi]*2
    LDA a_hi  ; compare high bytes
    CMP b_hi
    BCC label ; if NUM1H < NUM2H then NUM1 < NUM2
    BNE LABEL ; if NUM1H <> NUM2H then NUM1 > NUM2 (so NUM1 >= NUM2)
    LDA a_low  ; compare low bytes
    CMP b_low
    BCC label ; if NUM1L < NUM2L then NUM1 < NUM2
    LABEL:
.endmacro