74 lines
1.5 KiB
ArmAsm
Executable file
74 lines
1.5 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 )
|
|
.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
|