📄 common.inc
字号:
.IFNDEF _COMMON_INC_
_COMMON_INC_ .EQU 1
FALSE .EQU 0
TRUE .EQU 1
LOW .EQU 0
HIGH .EQU 1
IN .EQU 0
OUT .EQU 1
NULL .EQU 00h
ASCII_SPACE .EQU 20h
ASCII_DOT .EQU '.'
LDAX macro va,vx
lda va
ldx vx
endm
STAX macro va,vx
sta va
stx vx
endm
SET_BYTE macro dst,src
lda src
sta dst
endm
SET_WORD macro dstL,dstH,srcL,srcH
lda srcL
sta dstL
lda srcH
sta dstH
endm
BRA_COND macro inst,bit,status,label
.IF ASSEMBLER=ZARDOZ
inst@<bit> status,label
.ENDIF ;ASSEMBLER=ZARDOZ
.IF ASSEMBLER=R2500AD
inst|<bit> status,label
.ENDIF ;ASSEMBLER=R2500AD
endm
_CNT16_LOOP_SETUP macro regl,regh,cnt
.IF cnt>0
ld@regl #0
ld@regh #0
.ENDIF ;cnt>0
endm
_CNT16_LOOP_CNT macro regl,regh,adrl,adrh,cnt,label
.IF cnt>0
inc adrl
lda adrl
bne ?mem_no_carry#
inc adrh
?mem_no_carry#
in@regl
cp@regl #00h
bne ?reg_no_carry#
in@regh
?reg_no_carry#
cp@regl #<cnt
bne label
cp@regh #>cnt
bne label
.ENDIF ;cnt>0
endm
CMP_EQU macro fst,snd,target
lda fst
cmp snd
beq target
endm
CMP_NEQ macro fst,snd,target
lda fst
cmp snd
bne target
endm
CMP_LESS macro fst,snd,target
lda fst
cmp snd
bmi target
endm
CMP_GREATER macro fst,snd,target
lda fst
cmp snd
bpl target
endm
INSIDE macro val,low,high,_inside,_outside
lda val
sec
sbc low
bcc _outside
lda val
cmp high
beq _inside
sec
sbc high
bcc _inside
bra _outside
endm
; 16-bit operation
ADD16 macro dstL,dstH,srcL,srcH
clc
lda dstL
adc srcL
sta dstL
lda dstH
adc srcH
sta dstH
endm
SUB16 macro dstL,dstH,srcL,srcH
sec
lda dstL
sbc srcL
sta dstL
lda dstH
sbc srcH
sta dstH
endm
; divisor must be power of 2
Divide16_8 macro dividendL,dividendH,divisor,remainder
stz remainder
lda divisor
beq ?divisor_zero#
pha ; save divisor
?loop_div#
lsr divisor
bcs ?loop_div_end#
lsr dividendH
ror dividendL
ror remainder
bra ?loop_div#
?loop_div_end#
pla ; restore divisor
sta divisor
?shift_rem# ; shift remainder to the correct value
lsr remainder
asl A
bcs ?shift_rem_ok#
bra ?shift_rem#
?shift_rem_ok#
?divisor_zero#
endm
Multiply16_8 macro multiplicandL,multiplicandH,multiplier
lda multiplier
beq ?multiplier_zero#
pha ; save multiplier
?loop_mul#
lsr multiplier
bcs ?loop_mul_end#
asl multiplicandL
rol multiplicandH
bra ?loop_mul#
?loop_mul_end#
pla
sta multiplier ; restore multiplier
bra ?mul_end#
?multiplier_zero#
stz multiplicandL
stz multiplicandH
?mul_end#
endm
MOD16 macro modendL,modendH,moderL,moderH
?loop_mod#
CMP16_LESS modendL,modendH,moderL,moderH,?mod_end#
SUB16 modendL,modendH,moderL,moderH
bra ?loop_mod#
?mod_end#
endm
; even : carry clr
; odd : carry set
ODDEVEN16 macro varL,varH
lda varL
and #00000001b
beq ?even#
?odd#
sec
bra ?_end#
?even#
clc
?_end#
endm
INC16 macro meml,memh
inc meml
lda meml
bne ?no_carry#
inc memh
?no_carry#
endm
DEC16 macro meml,memh
dec meml
lda meml
cmp #FFh
bne ?no_carry#
dec memh
?no_carry#
endm
CMP16_EQU macro fstl,fsth,sndl,sndh,target
lda fstl
cmp sndl
bne ?cmp_end# ; not equal, continue...
lda fsth
cmp sndh
bne ?cmp_end# ; not equal, continue...
bra target ; equal, branch to target
?cmp_end#
endm
CMP16_NEQ macro fstl,fsth,sndl,sndh,target
lda fstl
cmp sndl
bne target ; not equal, branch to target
lda fsth
cmp sndh
bne target ; not equal, branch to target
endm
; greater: carry set
; equal : carry clr
; less : branch to target
CMP16_LESS macro fstl,fsth,sndl,sndh,target
lda fsth
sec
sbc sndh
bcc target
bne ?greater#
?cmp_lo#
lda fstl
sec
sbc sndl
bcc target
bne ?greater#
?is_equ#
clc
bra ?cmp_end#
?greater#
sec
?cmp_end#
endm
; greater: branch to target
; equal : carry clr
; less : carry set
CMP16_GREATER macro fstl,fsth,sndl,sndh,target
lda fsth
sec
sbc sndh
beq ?cmp_lo# ; hi equal, compare lo
bcs target ; hi greater, branch to target
bra ?less# ; hi less...
?cmp_lo#
lda fstl
sec
sbc sndl
beq ?is_equ#
bcs target ; lo greater, branch to target
?less#
sec
bra ?cmd_end#
?is_equ#
clc
?cmd_end#
endm
INSIDE16 macro valL,valH,lowL,lowH,upL,upH,inside,outside
CMP16_LESS valL,valH,lowL,lowH,outside
CMP16_GREATER valL,valH,upL,upH,outside
bra inside
endm
; 32-bit operation
ADD32 macro dstLL,dstLH,dstHL,dstHH,srcLL,srcLH,srcHL,srcHH
clc
lda dstLL
adc srcLL
sta dstLL
lda dstLH
adc srcLH
sta dstLH
lda dstHL
adc srcHL
sta dstHL
lda dstHH
adc srcHH
sta dstHH
endm
SUB32 macro dstLL,dstLH,dstHL,dstHH,srcLL,srcLH,srcHL,srcHH
sec
lda dstLL
sbc srcLL
sta dstLL
lda dstLH
sbc srcLH
sta dstLH
lda dstHL
sbc srcHL
sta dstHL
lda dstHH
sbc srcHH
sta dstHH
endm
LONG_ZERO macro ll,lh,hl,hh,target
lda ll
beq ?cmp_lh#
bra ?not_zero#
?cmp_lh#
lda lh
beq ?cmp_hl#
bra ?not_zero#
?cmp_hl#
lda hl
beq ?cmp_hh#
bra ?not_zero#
?cmp_hh#
lda hh
beq target
?not_zero#
endm
LONG_NZERO macro ll,lh,hl,hh,target
lda ll
bne target
lda lh
bne target
lda hl
bne target
lda hh
bne target
endm
CMP32_LESS macro fstll,fstlh,fsthl,fsthh,sndll,sndlh,sndhl,sndhh,target
CMP16_LESS fsthl,fsthh,sndhl,sndhh,target
bcs ?greater#
CMP16_LESS fstll,fstlh,sndll,sndlh,target
?greater#
endm
CMP32_GREATER macro fstll,fstlh,fsthl,fsthh,sndll,sndlh,sndhl,sndhh,target
CMP16_GREATER fsthl,fsthh,sndhl,sndhh,target
bcs ?less#
CMP16_GREATER fstll,fstlh,sndll,sndlh,target
?less#
endm
CMP32_EQU macro fstll,fstlh,fsthl,fsthh,sndll,sndlh,sndhl,sndhh,target
CMP16_EQU fsthl,fsthh,sndhl,sndhh,?cmp_low16#
bra ?not_equ#
?cmp_low16#
CMP16_EQU fstll,fstlh,sndll,sndlh,target
?not_equ#
endm
MINIMUM macro n1,n2
lda n1
sec
sbc n2
bcs ?greater_than_or_equal_to#
?less_than#
lda n1
bra ?min_end#
?greater_than_or_equal_to#
lda n2
?min_end#
endm
MINIMUM16 macro n1L,n1H,n2L,n2H
lda n1H
sec
sbc n2H
bcc ?less_than#
bne ?greater_than#
?equal_to#
lda n1L
sec
sbc n2L
bcc ?less_than#
?greater_than#
lda n2L
ldx n2H
bra ?min_end#
?less_than#
lda n1L
ldx n1H
?min_end#
endm
MAXIMUM macro n1,n2
lda n1
sec
sbc n2
bcs ?greater_than_and_equal_to#
?less_than#
lda n2
bra ?max_end#
?greater_than_and_equal_to#
lda n1
?max_end#
endm
.ENDIF ;_COMMON_INC_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -