140 lines
2.9 KiB
ArmAsm
Executable file
140 lines
2.9 KiB
ArmAsm
Executable file
;;; -*- 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
|
|
.include "16add.s"
|
|
|
|
;; 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
|