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

📄 macro.h

📁 基本完成迷控制算法
💻 H
字号:
ifndef _macro_
       _macro_ 	equ	1
       
//====================================================
//Note: 利用X、Y、Z进行查表的指针确定,基数存于Acc中
//====================================================       
inc_xyz_a	expand	
	add	z,a	
	b0bts1	fc	
	jmp	@f	
	incms	y	
	jmp	@f
	incms	x
	nop
@@:	
	endm
//====================================================
//Note: 利用Y、Z进行查表的指针确定,基数存于Acc中
//====================================================
inc_yz_a	expand
	add	z,a
	b0bts1	fc
	jmp	@f
	incms	y
	nop
@@:	
	endm
//====================================================
//Note:利用X、Y、Z顺序查表的指针确定
//===================================================
inc_xyz	expand
	incms	z
	jmp	@f
	incms	y
	jmp	@f
	incms	x
	nop
@@:	
	endm
//====================================================
//Note:利用H、L顺序读取RAM的指针确定
//====================================================
inc_hl	expand
	incms	l	
	jmp	@f	
	incms	h	
	nop		
@@:	
	endm	
//====================================================
//Note:利用Y、Z进行查表的指针确定
//====================================================
inc_yz	expand
	incms	z
	jmp	@f
	incms	y
	nop
@@:	
	endm	
//====================================================
//Note:进行地址步阶的直接跳跃
//====================================================
jmp_adr	expand	
	b0add	pcl,a		// pcl = pcl + a
	b0bts1	fc
	jmp	@f
	incms	pch
	nop
@@:
	endm
//====================================================
//Note:利用Acc中数据作为地址的跳跃
//====================================================
jmp_aa	expand	
	b0mov	pcl,a		// pcl = a
	endm
//====================================================
//Note: 确定中断的地址
//====================================================
@here_interrupt	expand	int
	temp	=	$
	org	irq_m&int
	jmp	temp
	org	temp
	endm
//=====================================================
//Note:进入中断的压栈保护,需用户自行定义Accbuf等Ram单元
//=====================================================
@push2	expand
	b0xch  accbuf,a
	b0mov  a,pflag
	b0mov  pflagbuf,a
	b0mov  a,rbank
	b0mov  rbankbuf,a

	b0mov  a,l
	b0mov  lbuf,a
	b0mov  a,h
	b0mov  hbuf,a
	b0mov  a,r
	b0mov  rbuf,a	
	b0mov  a,x
	b0mov  xbuf,a	
	b0mov  a,y
	b0mov  ybuf,a
	b0mov  a,z
	b0mov  zbuf,a
	endm
//=======================================================
//Note:进入中断的压栈保护,需用户自行定义Accbuf等Ram单元
//=======================================================
@push1	expand
	b0xch  accbuf,a
	b0mov  a,pflag
	b0mov  pflagbuf,a
	b0mov  a,rbank
	b0mov  rbankbuf,a

	b0mov  a,r
	b0mov  rbuf,a	
	b0mov  a,y
	b0mov  ybuf,a
	b0mov  a,z
	b0mov  zbuf,a 
	endm
//=======================================================
//Note:进入中断的压栈保护,需用户自行定义Accbuf等Ram单元
//=======================================================
@push0	expand
	b0xch  accbuf,a
	b0mov  a,pflag
	b0mov  pflagbuf,a
	b0mov  a,rbank
	b0mov  rbankbuf,a
	endm
//=======================================================
//Note:退出中断的出栈恢复,需用户自行定义Accbuf等Ram单元
//=======================================================
@pop2	expand
	b0mov  a,lbuf
	b0mov  l,a
	b0mov  a,hbuf
	b0mov  h,a
	b0mov  a,rbuf
	b0mov  r,a
	b0mov  a,xbuf
	b0mov  x,a
	b0mov  a,ybuf
	b0mov  y,a
	b0mov  a,zbuf
	b0mov  z,a
	
	b0mov  a,rbankbuf
	b0mov  rbank,a
	b0mov  a,pflagbuf
	b0mov  pflag,a
	b0xch  a,accbuf
	endm
//====================================================
//Note:退出中断的出栈恢复,需用户自行定义Accbuf等Ram单元
//====================================================
@pop1	expand
	b0mov  a,rbuf
	b0mov  r,a
	b0mov  a,ybuf
	b0mov  y,a
	b0mov  a,zbuf
	b0mov  z,a
	
	b0mov  a,rbankbuf
	b0mov  rbank,a
	b0mov  a,pflagbuf
	b0mov  pflag,a
	b0xch  a,accbuf
	endm
//====================================================
//Note:退出中断的出栈恢复,需用户自行定义Accbuf等Ram单元
//====================================================
@pop0	expand
	b0mov  a,rbankbuf
	b0mov  rbank,a
	b0mov  a,pflagbuf
	b0mov  pflag,a
	b0xch  a,accbuf
	endm
//====================================================
//Note:进入RAM的bank0
//====================================================
bank0	expand
	clr	rbank
	endm
//====================================================
//Note:进入RAM的bank1
//====================================================
bank1	expand
	b0mov    rbank,#01h
	endm
//====================================================
//Note:进入RAM的bank2
//====================================================
bank2	expand
	b0mov    rbank,#02h
	endm
//====================================================
//Note:进入RAM的bank15
//====================================================
bank15  expand
	b0mov    rbank,#0fh
	endm
//====================================================
//Note:进入RAM的bank0,并退出子程序
//====================================================
ret_ban0	expand
	bank0
	ret
	endm
//====================================================
//Note:RAM资料的指针指向确定
//====================================================
point_hl	expand  val
	b0mov    h,#val$m
	b0mov    l,#val$l
	endm
//====================================================
//Note:ROM资料的指针指向确定
//====================================================
point_yz	expand  val
	b0mov    y,#val$m
	b0mov    z,#val$l
	endm
//====================================================
//Note:ROM资料的指针指向确定
//====================================================
point_xyz	expand  val
	b0mov    x,#val$h
	b0mov    y,#val$m
	b0mov    z,#val$l
	endm
//====================================================
//	to check acc in some range, example : #30h - #39h,
//	use boundi	ram_to_acc, #30h, #39h, over_jmp_addr
//	if acc is under the range
//      acc = acc - sm
//	else
//	   jmp over_jmp=addr
//	Note :	1. acc will be changed, c, dc, z flag will be changed
//           	2. the macro is used for "jmp_ar" macro
//Val中的数据介于sm和la之间程序跳到adr处
//====================================================
boundi	expand	val, sm, la, adr
	mov	a,val
	add	a, #(0xff - (la))
	b0bts0	fc
	jmp_ret	<adr>
	ifnb	<sm>
		if	(sm) > 0
			add	a, #((la) - (sm) + 1)
			b0bts1	fc
			jmp_ret	<adr>
		endif
	endif
	mov   a,val
	sub     a,#sm
	endm
//====================================================
//	to add ram=ram+1 from 00 to ff
//	if ram > <la>
//      ram = <sm> 
//====================================================
lim_inc expand val, sm, la
	incms    val
	jmp      $+2
	jmp      $+4
	b0mov    a,val
	sub      a,#((la) + 1 )
	jnc      $+3
	mov      a,#sm
	b0mov    val,a
    endm
//====================================================
//	to sub ram=ram-1 from <sm> to <la>
//	if ram < <sm>
//      ram = <la> 
//====================================================
lim_dec expand val, sm, la
	if	sm == 0
		b0mov   a,val
		jnz     $+4
		mov     a,#la
		b0mov   val,a
		jmp	$+3
		decms   val
		nop
	else
		decms   val
		nop
		b0mov   a,val
		sub     a,#( sm - 1 )
		jnc	$+3
		mov     a,#la
		b0mov   val,a
	endif
	endm
//====================================================
//	to add ram=ram+1 from 00 to ff
//	if ram > <la>
//      ram = <la> 
//====================================================
limh_inc	expand val, sm, la
	incms    val
	jmp      $+2
	jmp      $+4
	b0mov    a,val
	sub      a,#((la) + 1 )
	jnc      $+3
	mov      a,#la
	b0mov    val,a
    endm
//====================================================
//	to sub ram=ram-1 from <sm> to <la>
//	if ram < <sm>
//      ram = <sm> 
//====================================================
liml_dec expand val, sm, la
	if	sm == 0
		b0mov   a,val
		jnz     $+4
		mov     a,#sm
		b0mov   val,a
		jmp		$+3
		decms   val
		nop
	else
		decms   val
		nop
		b0mov   a,val
		sub     a,#( sm - 1 )
		jnc	$+3
		mov     a,#sm
		b0mov   val,a
	endif
    	endm
//====================================================
//      clr_ramX	;clear ram from #00 to max address(bank0,bank1)
//note: y,z,c may be changed.
//====================================================
clr_ram0   expand    adr
	clr     y	  	// set ram bank0
	b0mov	z,#(adr)	// use indirect addressing index pointer (@yz)
				// set pointer = 0x00xx	
    	clr	@yz
	decms	z	  	// z = z -1
	jmp	$-2 		// skip if z = 0
	clr	@yz
	endm	
//====================================================
clr_ram1   expand    adr
	b0mov	y,#1	  	// set ram bank1
	b0mov	z,#(adr)	// use indirect addressing index pointer (@yz)
				// set pointer = 0x00xx	
    	clr	@yz
	decms	z	  	// z = z -1
	jmp	$-2 		// skip if z = 0
	clr	@yz
	endm		
//====================================================
sleep	expand
	b0bset	fcpum0
	endm
//====================================================
//      circularly shift val
//note: 1. c will be changed.
//    	2. must includestd macro1.h
//====================================================
rrcmn	expand	mem,val	
	repeat	val
	rrcm	mem
	endm
	endm
//====================================================
rlcmn	expand	mem,val	
	repeat	val
	rlcm	mem
	endm
	endm
//====================================================
shln	expand	mem,val	
	repeat	val
	shl	mem
	endm
	endm
//====================================================
shrn	expand	mem,val	
	repeat	val
	shr	mem
	endm
	endm
//====================================================
roln	expand	mem,val	
	repeat	val
	rol	mem
	endm
	endm
//====================================================	
rorn	expand	mem,val	
	repeat	val
	ror	mem
	endm
	endm
//====================================================
notb	expand	f	
	b0bts1	f
	jmp	$+3
	b0bclr	f
	jmp	$+2
	b0bset	f	
	endm
//====================================================
//	add_de, adc_de, adcm_de, addm_de ;algorism addition					
//====================================================
add_de	expand	acc,v1
	add	acc,v1
	daa
	endm
//====================================================
adc_de	expand	acc,v1
	adc	acc,v1
	daa
	endm
//====================================================
adcm_de	expand	v1,v2
	b0mov	a,v2
	adc	a,v1
	daa
	b0mov	v1,a
	endm
//====================================================
addm_de	expand	v1,v2
	b0mov	a,v2
	add	a,v1
	daa
	b0mov	v1,a
	endm
//====================================================
//	subm_de, sbcm_de     ;algorism subtration						
//====================================================
Subm_de	expand	v1,v2	
	mov	a,#99h
		sub	a,v2
		adc	a,v1
		daa
		b0mov	v1,a
	endm
//====================================================
Sbcm_de	expand	v1,v2
	mov	a,#99h
	sbc	a,v2
	adc	a,v1
	daa
	b0mov	v1,a
	endm
//====================================================
Xchgupcycle_	expand	adr, list:vararg
	@s_temp1=adr
	for	ls, <list>
		xch	a, ls
		xch	a, @s_temp1
		@s_temp1	=	@s_temp1 + 1
	endm
		xch	a,@s_temp1
	endm 
//====================================================
//must use serial ram byte,can economize ram byte
Downbyte_cycle	expand	adr,list:vararg	
	@s_temp1 = adr
	for	ls, <list>
		xch	a,@s_temp1
		@s_temp1 = @s_temp1 + 1
	endm
		xch	a,@s_temp1
		xch	a,adr	
	endm 
//ex:	downbyte_cycle	wk0,wk1,wk2,...,wkn
//		(wkn are serial ram byte)
//result:wkn,wk0,wk1,...wk(n-1)
//====================================================
//must use serial ram byte,can economize ram byte
Upbyte_cycle	expand	adr,list:vararg
	@s_temp1 = adr
	for	ls, <list>
		xch	a,ls
		xch	a,@s_temp1
		@s_temp1 = @s_temp1 + 1
	endm
		xch	a,@s_temp1
	endm 
//ex:	upbyte_cycle	wk0,wk1,wk2,...,wkn		       
//       	(wkn are serial ram byte)
//result:wk1,wk2,wk3,...wk0
//====================================================
//Note:将v1与v2中的数据交换
//====================================================
XCHM	expand	v1,v2
	xch	a,v2
	xch	a,v1
	xch	a,v2
	endm
//====================================================
//Note:将v2中的数据bit倒置存于v1中
//====================================================
ConvertM	expand	v1,v2
	clr	v1
	bts0	v2.0
	bset	v1.7
	bts0	v2.1
	bset	v1.6
	bts0	v2.2
	bset	v1.5
	bts0	v2.3
	bset	v1.4
	bts0	v2.4
	bset	v1.3
	bts0	v2.5
	bset	v1.2
	bts0	v2.6
	bset	v1.1
	bts0	v2.7
	bset	v1.0
	endm
//====================================================
//Note:将v2中的数据bit倒置取反并存于v1中
//====================================================
Convert_M	expand	v1,v2
	clr	v1
	bts1	v2.0
	bset	v1.7
	bts1	v2.1
	bset	v1.6
	bts1	v2.2
	bset	v1.5
	bts1	v2.3
	bset	v1.4
	bts1	v2.4
	bset	v1.3
	bts1	v2.5
	bset	v1.2
	bts1	v2.6
	bset	v1.1
	bts1	v2.7
	bset	v1.0
	endm
//====================================================
//Note: 将位f1与位f2相与赋予f2
//====================================================
AND_f	macro	f1,f2
	bts0	f1
	jmp	$+2
	bclr	f2
	endm

endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -