;;; -*- 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 always 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 .if .not .match ({b_low}, a) LDA b_low .endif ;;untested ADC a_low STA a_low .if .match ({b_hi}, x) ;;Untested TXA .else LDA b_hi .endif ADC a_hi STA a_hi .endmacro ;; Subtraction uses always uses 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 ;; if b_low = A and b_hi =A .if .match({b_low}, a) .and .match({b_hi}, a) ;;untested .LOCAL rewrite .LOCAL rewrite2 STA rewrite +1 STA rewrite2 + 1 LDA a_low rewrite: SBC #b_low STA a_low LDA a_hi rewrite2: SBC #b_hi STA a_hi ;; if b_low = A .elseif .match({b_low}, a) ;;untested .LOCAL rewrite STA rewrite +1 LDA a_low rewrite: SBC #b_low STA a_low LDA a_hi SBC b_hi STA a_hi .elseif .match({b_hi}, a) ;;untested .LOCAL rewrite STA rewrite +1 LDA a_low SBC b_low STA a_low LDA a_hi rewrite: SBC #b_hi STA a_hi .else LDA a_low SBC b_low STA a_low LDA a_hi SBC b_hi STA a_hi .endif .endmacro ;; Subtraction uses always uses A register ;; a = (A, a_hi) - b .macro Sub_16_A a_low, a_hi, b_low, b_hi, fast_unsafe ;; IF to run it fast .ifblank fast_unsafe SEC .endif SBC b_low STA a_low LDA a_hi SBC b_hi STA a_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 ;;http://www.6502.org/tutorials/compare_beyond.html ;;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 .LOCAL LABEL LDA a_hi CMP b_hi BCC label BNE LABEL LDA a_low .if .match ({b_low}, a) .LOCAL next STY next +1 next: CMP #$ff .else CMP b_low .endif BCC label LABEL: .endmacro