c64-livecoding/wip-hugo/macros/16aritmatic.s

60 lines
1.3 KiB
ArmAsm
Executable file

;; 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 )
.else
LDA b_low
.endif
LDA b_low
ADC a_low
STA a_low
LDA b_hi
LDA b_hi
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