mirror of
https://github.com/mi57730/a2d.git
synced 2025-08-10 08:25:15 +00:00
helper macro func
This commit is contained in:
34
macros.inc
34
macros.inc
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
.define is_immediate(arg) (.match (.mid (0, 1, {arg}), #))
|
.define is_immediate(arg) (.match (.mid (0, 1, {arg}), #))
|
||||||
.define is_register(arg) (.match ({arg}, x) .or .match ({arg}, y))
|
.define is_register(arg) (.match ({arg}, x) .or .match ({arg}, y))
|
||||||
|
.define immediate_value(arg) (.right (.tcount ({arg})-1, {arg}))
|
||||||
|
|
||||||
;;; ==================================================
|
;;; ==================================================
|
||||||
;;; Pad with zeros to the given address
|
;;; Pad with zeros to the given address
|
||||||
@@ -65,6 +66,7 @@
|
|||||||
jmp target
|
jmp target
|
||||||
.endmacro
|
.endmacro
|
||||||
|
|
||||||
|
|
||||||
;;; ==================================================
|
;;; ==================================================
|
||||||
;;; 16-bit pseudo-ops
|
;;; 16-bit pseudo-ops
|
||||||
|
|
||||||
@@ -73,8 +75,8 @@
|
|||||||
;;; ldax $1234 ; absolute
|
;;; ldax $1234 ; absolute
|
||||||
.macro ldax arg
|
.macro ldax arg
|
||||||
.if is_immediate {arg}
|
.if is_immediate {arg}
|
||||||
lda #<(.right (.tcount ({arg})-1, {arg}))
|
lda #<immediate_value {arg}
|
||||||
ldx #>(.right (.tcount ({arg})-1, {arg}))
|
ldx #>immediate_value {arg}
|
||||||
.else
|
.else
|
||||||
lda arg
|
lda arg
|
||||||
ldx arg+1
|
ldx arg+1
|
||||||
@@ -86,8 +88,8 @@
|
|||||||
;;; ldxy $1234 ; absolute
|
;;; ldxy $1234 ; absolute
|
||||||
.macro ldxy arg
|
.macro ldxy arg
|
||||||
.if is_immediate {arg}
|
.if is_immediate {arg}
|
||||||
ldx #<(.right (.tcount ({arg})-1, {arg}))
|
ldx #<immediate_value {arg}
|
||||||
ldy #>(.right (.tcount ({arg})-1, {arg}))
|
ldy #>immediate_value {arg}
|
||||||
.else
|
.else
|
||||||
ldx arg
|
ldx arg
|
||||||
ldy arg+1
|
ldy arg+1
|
||||||
@@ -138,10 +140,10 @@
|
|||||||
.elseif is_immediate {arg2}
|
.elseif is_immediate {arg2}
|
||||||
lda arg1
|
lda arg1
|
||||||
clc
|
clc
|
||||||
adc #<(.right (.tcount ({arg2})-1, {arg2}))
|
adc #<immediate_value {arg2}
|
||||||
sta arg3
|
sta arg3
|
||||||
lda arg1+1
|
lda arg1+1
|
||||||
adc #>(.right (.tcount ({arg2})-1, {arg2}))
|
adc #>immediate_value {arg2}
|
||||||
sta arg3+1
|
sta arg3+1
|
||||||
.else
|
.else
|
||||||
lda arg1
|
lda arg1
|
||||||
@@ -193,20 +195,20 @@
|
|||||||
sbc arg2+1
|
sbc arg2+1
|
||||||
sta arg3+1,arg4
|
sta arg3+1,arg4
|
||||||
.elseif is_immediate {arg1}
|
.elseif is_immediate {arg1}
|
||||||
lda #<(.right (.tcount ({arg1})-1, {arg1}))
|
lda #<immediate_value {arg1}
|
||||||
sec
|
sec
|
||||||
sbc arg2
|
sbc arg2
|
||||||
sta arg3
|
sta arg3
|
||||||
lda #>(.right (.tcount ({arg1})-1, {arg1}))
|
lda #>immediate_value {arg1}
|
||||||
sbc arg2+1
|
sbc arg2+1
|
||||||
sta arg3+1
|
sta arg3+1
|
||||||
.elseif is_immediate {arg2}
|
.elseif is_immediate {arg2}
|
||||||
lda arg1
|
lda arg1
|
||||||
sec
|
sec
|
||||||
sbc #<(.right (.tcount ({arg2})-1, {arg2}))
|
sbc #<immediate_value {arg2}
|
||||||
sta arg3
|
sta arg3
|
||||||
lda arg1+1
|
lda arg1+1
|
||||||
sbc #>(.right (.tcount ({arg2})-1, {arg2}))
|
sbc #>immediate_value {arg2}
|
||||||
sta arg3+1
|
sta arg3+1
|
||||||
.else
|
.else
|
||||||
lda arg1
|
lda arg1
|
||||||
@@ -254,9 +256,9 @@
|
|||||||
sta arg2+1,arg3
|
sta arg2+1,arg3
|
||||||
.elseif is_immediate {arg1}
|
.elseif is_immediate {arg1}
|
||||||
;; immediate load variant (arg1 is #nnnn)
|
;; immediate load variant (arg1 is #nnnn)
|
||||||
lda #<(.right (.tcount ({arg1})-1, {arg1}))
|
lda #<immediate_value {arg1}
|
||||||
sta arg2
|
sta arg2
|
||||||
lda #>(.right (.tcount ({arg1})-1, {arg1}))
|
lda #>immediate_value {arg1}
|
||||||
sta arg2+1
|
sta arg2+1
|
||||||
.else
|
.else
|
||||||
lda arg1
|
lda arg1
|
||||||
@@ -289,16 +291,16 @@
|
|||||||
sbc arg2+1,arg3
|
sbc arg2+1,arg3
|
||||||
.elseif is_immediate {arg1}
|
.elseif is_immediate {arg1}
|
||||||
;; immediate variant (arg1 is #nnnn)
|
;; immediate variant (arg1 is #nnnn)
|
||||||
lda #<(.right (.tcount ({arg1})-1, {arg1}))
|
lda #<immediate_value {arg1}
|
||||||
cmp arg2
|
cmp arg2
|
||||||
lda #>(.right (.tcount ({arg1})-1, {arg1}))
|
lda #>immediate_value {arg1}
|
||||||
sbc arg2+1
|
sbc arg2+1
|
||||||
.elseif is_immediate {arg2}
|
.elseif is_immediate {arg2}
|
||||||
;; immediate variant (arg2 is #nnnn)
|
;; immediate variant (arg2 is #nnnn)
|
||||||
lda arg1
|
lda arg1
|
||||||
cmp #<(.right (.tcount ({arg2})-1, {arg2}))
|
cmp #<immediate_value {arg2}
|
||||||
lda arg1+1
|
lda arg1+1
|
||||||
sbc #>(.right (.tcount ({arg2})-1, {arg2}))
|
sbc #>immediate_value {arg2}
|
||||||
.else
|
.else
|
||||||
lda arg1
|
lda arg1
|
||||||
cmp arg2
|
cmp arg2
|
||||||
|
Reference in New Issue
Block a user