;;; -*- 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 ;;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