;; 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 LDA b_low ADC a_low STA a_low LDA b_hi ADC a_hi STA a_hi .endmacro ; Untested! .macro Add_16_AX low, hi, fast_unsafe; , A, X ;; IF to run it fast .ifblank fast_unsafe CLC .endif ADC low STA low TXA ADC hi STA 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 ;;Untested .macro Sub_16_AX low, hi, fast_unsafe; , A, X ;; IF to run it fast .ifblank fast_unsafe SEC .endif SBC low STA low TXA SBC hi STA 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