⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.inc

📁 FLASH烧录 麻将机。。。。 FLASH烧录 麻将机
💻 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 + -