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

📄 globdefs.inc

📁 A 64 points Discrete Fourier Transform code in AVR asm.
💻 INC
📖 第 1 页 / 共 2 页
字号:

	;+-----------------------------------
	;| STORE ACC WORD TO MEMORY 
	;+-----------------------------------
	;
	;	stsaw	mem

	.MACRO	stsaw
		sts	@0,Acc
		sts	@0+1,AccH
	.ENDMACRO

	;+-----------------------------------
	;| STORE ACC WORD TO MEMORY with index
	;+-----------------------------------
	;
	;	stdaw	[X,Y,Z],index

	.MACRO	stdaw
		std	@0+@1,Acc
		std	@0+@1+1,AccH
	.ENDMACRO

	;+-----------------------------------
	;| STORE ACCT WORD TO MEMORY 
	;+-----------------------------------
	;
	;	stsawt	mem

	.MACRO	stsawt
		sts	@0,AccT
		sts	@0+1,AccTH
	.ENDMACRO

	;+-----------------------------------
	;| STORE ACCT WORD TO MEMORY with index
	;+-----------------------------------
	;
	;	stdawt	[X,Y,Z],index

	.MACRO	stdawt
		std	@0+@1,AccT
		std	@0+@1+1,AccTH
	.ENDMACRO

	;+-----------------------------------
	;| STORE REGISTER PAIR INTO MEMORY
	;+-----------------------------------
	;
	;	stsw	mem,Z  valid registers X,Y,Z

	.MACRO	stsw
		sts	@0,@1L
		sts	@0+1,@1H
	.ENDMACRO

	;+-----------------------------------
	;| STORE REGISTER PAIR INTO MEMORY with index
	;+-----------------------------------
	;
	;	stdw	[X,Y,Z],Z  valid registers X,Y,Z,index

	.MACRO	stdw
		std	@0+@1,@2L
		std	@0+@1+1,@2H
	.ENDMACRO

	;+-----------------------------------
	;| ADD IMEDIATE TO REGISTER
	;+-----------------------------------
	;
	;	addi	var,imm

	.MACRO	addi
		subi	@0,-(@1)
	.ENDMACRO

	.MACRO	adci
		sbci	@0,-(@1)
	.ENDMACRO

	;+-----------------------------------
	;| SUB ACC IMEDIATE TO REGISTER PAIR WORD 
	;+-----------------------------------
	;
	;	subiaw	var

	.MACRO	subiaw
		subi	Acc,low(@0)
		sbci	AccH,high(@0)
	.ENDMACRO

	;+-----------------------------------
	;| SUB ACCT IMEDIATE TO REGISTER PAIR WORD 
	;+-----------------------------------
	;
	;	subiawt	var

	.MACRO	subiawt
		subi	AccT,low(@0)
		sbci	AccTH,high(@0)
	.ENDMACRO

	;+-----------------------------------
	;| SUB ACC IMEDIATE TO REGISTER PAIR LONG
	;+-----------------------------------
	;
	;	subial	var

	.MACRO	subial
		subi	Acc,low(lwrd(@0))
		sbci	AccH,high(lwrd(@0))
		sbci	AccT,low(hwrd(@0))
		sbci	AccTH,high(hwrd(@0))
	.ENDMACRO

	;+-----------------------------------
	;| ADD ACC IMEDIATE TO REGISTER PAIR WORD 
	;+-----------------------------------
	;
	;	addiaw	var

	.MACRO	addiaw
		subi	Acc,low(-(@0))
		sbci	AccH,high(-(@0))
	.ENDMACRO

	;+-----------------------------------
	;| ADD ACCT IMEDIATE TO REGISTER PAIR WORD 
	;+-----------------------------------
	;
	;	addiawt	var

	.MACRO	addiawt
		subi	AccT,low(-(@0))
		sbci	AccTH,high(-(@0))
	.ENDMACRO

	;+-----------------------------------
	;| ADD ACC IMEDIATE TO REGISTER PAIR LONG
	;+-----------------------------------
	;
	;	addial	var

	.MACRO	addial
		subi	Acc,low(lwrd(-(@0)))
		sbci	AccH,high(lwrd(-(@0)))
		sbci	AccT,low(hwrd(-(@0)))
		sbci	AccTH,high(hwrd(-(@0)))
	.ENDMACRO

	;+-----------------------------------
	;| SUB IMEDIATE TO REGISTER PAIR WORD 
	;+-----------------------------------
	;
	;	subiw	var,imm valid registers X,Y,Z

	.MACRO	subiw
		subi	@0L,low(@1)
		sbci	@0H,high(@1)
	.ENDMACRO

	;+-----------------------------------
	;| SUB PAIR WORD 
	;+-----------------------------------
	;
	;	subiw	(imm valid registers X,Y,Z),(imm valid registers X,Y,Z)

	.MACRO	subw
		sub	@0L,@1L
		sbc	@0H,@1H
	.ENDMACRO

	;+-----------------------------------
	;| ADD IMEDIATE TO REGISTER PAIR WORD 
	;+-----------------------------------
	;
	;	addiw	var,imm valid registers X,Y,Z

	.MACRO	addiw
		subi	@0L,low(-(@1))
		sbci	@0H,high(-(@1))
	.ENDMACRO

	;+-----------------------------------
	;| ADD PAIR WORD 
	;+-----------------------------------
	;
	;	addw	(valid registers X,Y,Z),(valid registers X,Y,Z)

	.MACRO	addw
		add	@0L,@1L
		adc	@0H,@1H
	.ENDMACRO

	;+-----------------------------------
	;| COMPARE IMEDIATE TO REGISTER PAIR WORD 
	;+-----------------------------------
	;
	;	cpiw	var,imm valid registers X,Y,Z

	.MACRO	cpiw
		ldi	Temp,low(@1)
		cp	@0L,Temp
		ldi	Temp,high(@1)
		cpc	@0H,Temp
	.ENDMACRO

	;+-----------------------------------
	;| COMPARE REGISTER PAIR WORD 
	;+-----------------------------------
	;
	;	cpw	valid registers X,Y,Z,valid registers X,Y,Z

	.MACRO	cpw
		cp	@0L,@1L
		cpc	@0H,@1H
	.ENDMACRO

	;+-----------------------------------
	;| COMPARE ACC IMEDIATE TO WORD
	;+-----------------------------------
	;
	;	cpiaw	imm destroy Temp

	.MACRO	cpiaw
		cpi	Acc,low(@0)
		ldi	Temp,high(@0)
		cpc	AccH,Temp
	.ENDMACRO

	;+-----------------------------------
	;| COMPARE ACCT IMEDIATE TO WORD
	;+-----------------------------------
	;
	;	cpiawt	imm destroy Temp

	.MACRO	cpiawt
		cpi	AccT,low(@0)
		ldi	Temp,high(@0)
		cpc	AccTH,Temp
	.ENDMACRO

	;+-----------------------------------
	;| COMPARE ACC IMEDIATE TO LONG
	;+-----------------------------------
	;
	;	cpial	imm destroy Temp

	.MACRO	cpial
		cpi	Acc,low(lwrd(@0))
		ldi	Temp,high(lwrd(@0))
		cpc	AccH,Temp
		ldi	Temp,low(hwrd(@0))
		cpc	AccT,Temp
		ldi	Temp,high(hwrd(@0))
		cpc	AccTH,Temp
	.ENDMACRO

	;+-----------------------------------
	;| 16 BITS PUSHS
	;+-----------------------------------
	;
	;	push AccH:Acc
	;
	.MACRO	pushaw
		push	Acc
		push	AccH
	.ENDMACRO

	;
	;	push AccTH:AccT
	;
	.MACRO	pushawt
		push	AccT
		push	AccTH
	.ENDMACRO

	;
	;	push TempH:Temp
	;
	.MACRO	pushTempW
		push	Temp
		push	TempH
	.ENDMACRO

	;
	;	push X(word),Y(Word),Z(Word)
	;
	.MACRO	pushw
		push	@0L
		push	@0H
	.ENDMACRO

	;+-----------------------------------
	;| 16 BITS POPS
	;+-----------------------------------
	;
	;	pop AccH:Acc
	;
	.MACRO	popaw
		pop	AccH
		pop	Acc
	.ENDMACRO

	;
	;	pop AccTH:AccT
	;
	.MACRO	popawt
		pop	AccTH
		pop	AccT
	.ENDMACRO
	;
	;	pop TempH:Temp
	;
	.MACRO	popTempW
		pop	TempH
		pop	Temp
	.ENDMACRO

	;
	;	pop X(word),Y(Word),Z(Word)
	;
	.MACRO	popw
		pop	@0H
		pop	@0L
	.ENDMACRO


	;+-----------------------------------
	;| LONG BRANCHS
	;+-----------------------------------

	.MACRO	lbrne
		breq	PC+2
		rjmp	@0			;*<NOCHANGE>*
	.ENDMACRO

	.MACRO	lbreq
		brne	PC+2
		rjmp	@0			;*<NOCHANGE>*
	.ENDMACRO

	.MACRO	lbrcs
		brcc	PC+2
		rjmp	@0			;*<NOCHANGE>*
	.ENDMACRO

	.MACRO	lbrcc
		brcs	PC+2
		rjmp	@0			;*<NOCHANGE>*
	.ENDMACRO

	.MACRO	lbrlt
		brge	PC+2
		rjmp	@0			;*<NOCHANGE>*
	.ENDMACRO

	.MACRO	lbrmi
		brpl	PC+2
		rjmp	@0			;*<NOCHANGE>*
	.ENDMACRO

	.MACRO	lbrpo
		brmi	PC+2
		rjmp	@0			;*<NOCHANGE>*
	.ENDMACRO

	.MACRO	lbrge
		brlt	PC+2
		rjmp	@0			;*<NOCHANGE>*
	.ENDMACRO

	.MACRO	lbrsh
		brlo	PC+2
		rjmp	@0			;*<NOCHANGE>*
	.ENDMACRO

	.MACRO	lbrlo
		brsh	PC+2
		rjmp	@0			;*<NOCHANGE>*
	.ENDMACRO


	;+-----------------------------------
	;| LOOPS
	;+-----------------------------------

	.EQU	_LOOP_BYTE	= 3			;byte and integer control loop variables
	.EQU	_LOOP_INTEGER	= 6

		;+---------------------
		;| USAGE
		;|
		;| .DSEG
		;| X:	.BYTE _LOOP_BYTE	<--create a _LOOP_BYTE variable
		;| .CSEG
		;|
		;| FOR X,1,5,1			<--create counting from 1 to 5 step 1
		;|	do something		<--put your code here
		;| NEXT X			<--next X
		;+----------------------
	
		;+--------------------
		;| IMEDIATE FOR BYTE LOOP
		;|
		;| FOR X,i1,i2,i3
		;| X=loop variable
		;| i1=initial
		;| i2=end count
		;| i2=step
		;+--------------------
	.MACRO	FOR
		ldi	Temp,@1
		sts	@0+0,Temp			;store initial
		ldi	Temp,@2
		sts	@0+1,Temp			;store end
		ldi	Temp,@3
		sts	@0+2,Temp			;store step
		ldi	Temp,low(PC)			;save in stack return address
		push	Temp			
		ldi	Temp,high(PC-2)
		push	Temp
	.ENDMACRO
		;+--------------------
		;| IMEDIATE FOR INTEGER LOOP
		;| Syntax same a FOR
		;+--------------------
	.MACRO	FORi
		ldi	Temp,low(@1)
		sts	@0+0,Temp			;store initial
		ldi	Temp,high(@1)
		sts	@0+1,Temp
		ldi	Temp,low(@2)
		sts	@0+2,Temp			;store end
		ldi	Temp,high(@2)
		sts	@0+3,Temp
		ldi	Temp,low(@3)
		sts	@0+4,Temp			;store step
		ldi	Temp,high(@3)
		sts	@0+5,Temp
		ldi	Temp,low(PC)			;save in stack return address
		push	Temp			
		ldi	Temp,high(PC-2)
		push	Temp
	.ENDMACRO
		;+--------------------
		;| NEXT byte complement of FOR byte
		;|
		;| NEXT X
		;| X=loop variable
		;+--------------------
	.MACRO	NEXT
		lds	Temp,@0+0			;get variable
		lds	TempH,@0+2			;get increment
		add	Temp,TempH			;next variable
		sts	@0+0,Temp
		lds	TempH,@0+1			;get end
		inc	TempH
		cp	Temp,TempH			;variable reach end ?
		brsh	PC+2				;yes finish
		ret
		pop	TempH
		pop	Temp
	.ENDMACRO
		;+--------------------
		;| NEXTi integer complement of FORi integer
		;|
		;| NEXTi X
		;+--------------------
	.MACRO	NEXTi
		push	r0
		push	r1
		lds	Temp,@0+0			;get variable
		lds	TempH,@0+1
		lds	r0,@0+4				;get step
		lds	r1,@0+5
		add	Temp,r0				;next variable
		adc	TempH,r1
		sts	@0+0,Temp			;store back
		sts	@0+1,TempH
		lds	r0,@0+2				;get end
		lds	r1,@0+3
		cp	r0,Temp				;variable reach end ?
		cpc	r1,TempH
		pop	r1
		pop	r0
		brcs	PC+2				;yes, finish	
		ret					;return to for
		pop	TempH
		pop	Temp
	.ENDMACRO

		;+--------------------
		;| PUSH LOWER REGISTERS R0..R15
		;+--------------------
	.MACRO	_M_PUSH_LOWER_REGS
		push	r0
		push	r1
		push	r2
		push	r3
		push	r4
		push	r5
		push	r6
		push	r7
		push	r8
		push	r9
		push	r10
		push	r11
		push	r12
		push	r13
		push	r14
		push	r15
	.ENDMACRO
		;+--------------------
		;| PUSH UPPER REGISTERS R16..R31
		;+--------------------
	.MACRO	_M_PUSH_UPPER_REGS
		push	r16
		push	r17
		push	r18
		push	r19
		push	r20
		push	r21
		push	r22
		push	r23
		push	r24
		push	r25
		push	r26
		push	r27
		push	r28
		push	r29
		push	r30
		push	r31
	.ENDMACRO
		;+--------------------
		;| PUSH ALL REGISTERS R0..R31
		;+--------------------
	.MACRO	_M_PUSH_ALL_REGS
		_M_PUSH_LOWER_REGS
		_M_PUSH_UPPER_REGS
	.ENDMACRO

		;+--------------------
		;| POP LOWER REGISTERS R0..R15
		;+--------------------
	.MACRO	_M_POP_LOWER_REGS
		pop	r15
		pop	r14
		pop	r13
		pop	r12
		pop	r11
		pop	r10
		pop	r9
		pop	r8
		pop	r7
		pop	r6
		pop	r5
		pop	r4
		pop	r3
		pop	r2
		pop	r1
		pop	r0
	.ENDMACRO

		;+--------------------
		;| POP UPPER REGISTERS R16..R31
		;+--------------------
	.MACRO	_M_POP_UPPER_REGS
		pop	r31
		pop	r30
		pop	r29
		pop	r28
		pop	r27
		pop	r26
		pop	r25
		pop	r24
		pop	r23
		pop	r22
		pop	r21
		pop	r20
		pop	r19
		pop	r18
		pop	r17
		pop	r16
	.ENDMACRO

		;+--------------------
		;| POP ALL REGISTERS R0..R31
		;+--------------------

	.MACRO	_M_POP_ALL_REGS
		_M_POP_UPPER_REGS
		_M_POP_LOWER_REGS
	.ENDMACRO
#endif	

.exit
	

⌨️ 快捷键说明

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