;;; -*- Mode: asm; indent-tabs-mode: t; tab-width: 8 -*-

;; A file containing 16-bit macro arithmatic.
;; You may add ,! ass a 5:th parameter to skipp flagg clearing.
;; This will make it run faster but will have unintended behavior.

;;Se below for some fast 16bit logic
;;http://6502.org/tutorials/compare_beyond.html

;; Addition uses the A register
;; a = a + b
.macro Add_16 a_low, a_hi, b_low, b_hi, fast_unsafe
;; 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!
;; Addition uses the A register
;; a = a + b. b_low = A, b_hi = X
.macro Add_16_AX low, hi, fast_unsafe
;; IF to run it fast
.ifblank fast_unsafe
    CLC
.endif
	ADC low
	STA low
	TXA
	ADC hi
	STA hi
.endmacro

;; Subtraction uses the A register
;; a = a - b
.macro Sub_16 a_low, a_hi, b_low, b_hi, fast_unsafe
;; IF to run it fast
.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
;; Subtraction uses the A register
;; a = a - b. b_low = A, b_hi = X
.macro Sub_16_AX low, hi, fast_unsafe
;; IF to run it fast
.ifblank fast_unsafe
    SEC
.endif
	SBC low
	STA low
	TXA
	SBC hi
	STA hi
.endmacro

;; Multiplication of 2
;; a = a*2
.macro mult_16 low_, hi_, NOT_ROL
;; IF NOT_ROL
.ifblank fast_unsafe
        ASL low_
        ROL hi_
.else
        ROL low_
	ROL hi_
.endif
.endmacro

.macro Mov_16 a_low, a_hi, b_low, b_hi
        LDA b_low
        STA a_low
        LDA b_hi
        STA a_hi
.endmacro

;;Larger then operation, uses the A register
;;IF a < b then: jump to label
; C =0 if jump to LABEL
.macro Lag_16 a_low, a_hi, b_low, b_hi, label ; [low, hi] = [low, hi]*2
        LDA a_hi
        CMP b_hi
        BCC label
        BNE LABEL
        LDA a_low
        CMP b_low
        BCC label
        LABEL:
.endmacro