c64-livecoding/wip-hugo/macros/16aritmatic.s

102 lines
2 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 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