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

📄 globdefs.inc

📁 A 64 points Discrete Fourier Transform code in AVR asm.
💻 INC
📖 第 1 页 / 共 2 页
字号:
;+--------------------------------------------------------------+---+
;| BY JO肙 DARTAGNAN ANTUNES OLIVEIRA				    |
;|								    |
;|	ESTAS ROTINAS FORAM DESENVOLVIDAS A M蒁IDAS QUE FORAM SENDO |
;| NECESSITADAS DURANTE AO LONGO DE ALGUNS ANOS. ELAS  S肙  DE  USO |
;| LIVRE E QUAISQUER ALTERA钦ES SER肙 PERMITIDAS, DESDE QUE O  NOME |
;| DO AUTOR FIGURE NO IN虲IO DE CADA PROGRAMA E QUE CASO, O USO DELAS|
;| PROVOQUE MAL FUNCIONAMENTO, OU PREJU蚙O A TERCEIROS O AUTOR FICA |
;| LIVRE DESTAS. TODAS AS ROTINAS FORAM TESTADAS E EST肙 EM  USO EM |
;| SISTEMAS ONDE NENHUM PROBLEMA FOI RELATADO, TODAS FORAM FEITAS DA|
;| FORMA MAIS PR覺IMA DA PROGRAMA敲O ORIENTADA A OBJETO (OOP) SEM A |
;| IMPLEMENTA敲O DE INSTANCIAMENTO 				    |
;|								    |
;| QUAISQUER D赩IDAS MEU EMAIL E: dartagnanmath@hotmail.com 	    |
;| A MEDIDA DO POSS蚔EL RESPONDEREI A TODOS OS EMAILS.		    |
;+------------------------------------------------------------------+
;|								    |
;|	THIS ROUTINES THEY WERE DEVELOPED AT SAME TIME THAT WERE    |
;| NEEDED ALONG OF SOME YEARS. THEY ARE FOR USE FREE AND ANY        |
;| ALTERATIONS WILL BE PERMITED SINCE THAT AUTHOR NAME APPEAR AT    |
;| BEGINNER OF EACH PROGRAM, AND IF INCORRECT USE PRODUCE           |
;| MALFUNCIONS OR DAMAGE TO THIRD PARTIES THE AUTHOR STAY FREE.	    |
;| ALL ROTINES WERE TESTED AND STILL IN USE AT MANY SYSTEM AND NO   |
;| PROBLEM WERE RELATED. ALL ROTINES WERE MAKED AT CLOSED "ORIENTED |
;| OBJECT PROGRAMING" (OOP) WITHOUT INSTANCE IMPLEMENTATIONS:	    |
;|								    |
;| ANY QUESTIONS MY EMAIL IS dartagnanmath@hotmail.com		    |
;| SOON AS POSSIBLE AS ANSWER ALL EMAILS			    |
;+--------------------------------------------------------------+---+
;+------------------------------------------------------+
;| BY JO肙 DARTAGNAN ANTUNES OLIVEIRA			|
;| DATA: 10/04/2000					|
;>------------------------------------------------------<
;| G L O B A L  D E F I N I T I O N   F I L E 		|
;+------------------------------------------------------+


#ifndef __GLOBAL_DEFINITIONS__
	#define	__GLOBAL_DEFINITIONS__

	.message "+--------------------+"
	.message "|                    |"
	.message "| GLOBAL DEFINITIONS |"
	.message "|                    |"
	.message "+--------------------+"

	;+------------------------------------------------------+
	;| R E G I S T E R S   D E F I N I T I O N S		|
	;+------------------------------------------------------+

	.DEF	Acc		= r24				;my Works registers
	.DEF	AccH		= r25
	.DEF	AccT		= r16
	.DEF	AccTH		= r17
	.DEF	Temp		= r18				;My temp registers
	.DEF	TempH		= r19

	;+------------------------------------------------------+
	;| C O N S T A N T S   D E F I N I T I O N S		|
	;+------------------------------------------------------+

	.EQU	_ON			= 0XFF
	.EQU	_OFF			= 0X00
	.EQU	_EVEN			= 0X00
	.EQU	_ODD			= 0XFF
	.EQU	_NONE			= 0X00
	.EQU	_LEFT			= 0X01
	.EQU	_RIGHT			= 0X02
	.EQU	_UP			= 0X03
	.EQU	_DOWN			= 0X04
	.EQU	_PRESSED		= 0X05
	.EQU	_RELEASED		= 0X06
	.EQU	_TIMEOUT		= 0X07
	.EQU	_YES			= 0XFF
	.EQU	_NO			= 0X00
	.EQU	_OK			= 0XFF
	.EQU	_NOTOK			= 0X00

	;+------------------------------------------------------+
	;| ASCII CODES						|
	;+------------------------------------------------------+

	.EQU	_NULLCHAR		= 0X00		;Null Char
	.EQU	_BS			= 0X08		;Back space
	.EQU	_TAB			= 0X09		;Tab
	.EQU	_CR			= 0X0D		;Carriage Return
	.EQU	_LF			= 0X0A		;Line Feed
	.EQU	_NC			= 0XFF		;null char(special use)

	.EQU	_ASCII_NUL		= 0X00		;Null
	.EQU	_ASCII_SOH		= 0X01		; (start of heading)       
	.EQU	_ASCII_STX		= 0X02		; (start of text)          
	.EQU	_ASCII_ETX		= 0X03		; (end of text)            
	.EQU	_ASCII_EOT		= 0X04		; (end of transmission) - Not the same as ETB    
	.EQU	_ASCII_ENQ		= 0X05		; (enquiry)                
	.EQU	_ASCII_ACK		= 0X06		; (acknowledge)            
	.EQU	_ASCII_BEL 		= 0X07		; (bell) - Caused teletype machines to ring a bell.  Causes a beep
	.EQU	_ASCII_BS		= 0X08		; (backspace) - Moves the cursor (or print head) move backwards (left)
	.EQU	_ASCII_TAB		= 0X09		; (horizontal tab) - Moves the cursor (or print head) right to the next
	.EQU	_ASCII_LF  		= 0X0A		; (NL line feed, new line) - Moves the cursor (or print head) to a new
	.EQU	_ASCII_VT		= 0X0B		; (vertical tab)           
	.EQU	_ASCII_FF 		= 0X0C		; (form feed) - Advances paper to the top of the next page (if the
	.EQU	_ASCII_CR 		= 0X0D		; (carriage return) - Moves the cursor all the way to the left, but does
	.EQU	_ASCII_SO 		= 0X0E			; (shift out) - Switches output device to alternate character set.            
	.EQU	_ASCII_SI		= 0X0F		; (shift in)  - Switches output device back to default character set.
	.EQU	_ASCII_DLE 		= 0X10		; (data link escape)       
	.EQU	_ASCII_DC1		= 0X11		; (device control 1)       
	.EQU	_ASCII_DC2		= 0X12		; (device control 2)       
	.EQU	_ASCII_DC3		= 0X13		; (device control 3)       
	.EQU	_ASCII_DC4		= 0X14		; (device control 4)       
	.EQU	_ASCII_NAK		= 0X15		; (negative acknowledge)   
	.EQU	_ASCII_SYN		= 0X16		; (synchronous idle)       
	.EQU	_ASCII_ETB 		= 0X17		; (end of transmission block) - Not the same as EOT  
	.EQU	_ASCII_CAN		= 0X18		; (cancel)                 
	.EQU	_ASCII_EM		= 0X19		; (end of medium)  
	.EQU	_ASCII_SUB 		= 0X1A		; (substitute)             
	.EQU	_ASCII_ESC		= 0X1B		; (escape) 
	.EQU	_ASCII_FS  		= 0X1C		; (file separator)
	.EQU	_ASCII_GS 		= 0X1D		; (group separator)
	.EQU	_ASCII_RS  		= 0X1E		; (record separator)
	.EQU	_ASCII_US 		= 0X1F		; (unit separator)         
	.EQU	_ASCII_SPACE		= 0X20
	.EQU	_ASCII_SP		= _ASCII_SPACE
	.EQU	_ASCII_DEL		= 0X7F

	;+------------------------------------------------------+
	;| MATH DEFINITIONS					|
	;+------------------------------------------------------+

	.EQU	_LONG		= 4		;size of long
	.EQU	_INTEGER	= 2		;size of integer
	.EQU	_WORD		= 2		;size of word
	.EQU	_BYTE		= 1		;size of byte

	;+------------------------------------------------------+
	;| CHARACTER DISPLAY DEFINITIONS CHIP HD44780		|
	;+------------------------------------------------------+
	
	.EQU	_DISP_LINE_1	= 0			;1 LINE 
	.EQU	_DISP_LINE_2	= 1			;2 LINE
	.EQU	_DISP_FONT_5X8	= 0			;5X8 FONT SIZE
	.EQU	_DISP_FONT_5X10	= 1			;5X10 FONT SIZE
	.EQU	_DISP_4BITS	= 0			;4 bits interface definitions
	.EQU	_DISP_8BITS	= 1			;8 bits interface definitions

	;+----------------------------------------
	;| WAVE DEFINITIONS
	;+----------------------------------------

	.EQU	_WAVE_DAC_8	= 8			;8 bits wave dac
	.EQU	_WAVE_DAC_16	= 16			;16 bits wave dac
	.EQU	_WAVE_DAC_24	= 24			;24 bits wave dac
	.EQU	_WAVE_DAC_32	= 32			;32 bits wave dac

	.EQU	_WAVE_FS_5500	= 5500			;5500 sample/second
	.EQU	_WAVE_FS_6000	= 6000			;6000 sample/second
	.EQU	_WAVE_FS_8000	= 8000			;8000 sample/second
	.EQU	_WAVE_FS_11025	= 11050			;11050 sample/second
	.EQU	_WAVE_FS_22050	= 22050			;22050 sample/second
	.EQU	_WAVE_FS_32000	= 32000			;32000 sample/second
	.EQU	_WAVE_FS_44100	= 44100			;44100 sample/second

	.EQU	_WAVE_SOURCE_FLASH	= 1		;wave into avr flash
	.EQU	_WAVE_SOURCE_SRAM	= 2		;wave into avr sram
	.EQU	_WAVE_SOURCE_DEVICE	= 3		;wave into device

	.EQU	_WAVE_STATUS_PLAYING	= 1		;wave status playing
	.EQU	_WAVE_STATUS_STOPED	= 2		;wave status stoped
	.EQU	_WAVE_STATUS_END	= 3		;wave status end

	;+------------------------------------------------------+
	;| S R A M  B O O T  T Y P E 				|
	;+------------------------------------------------------+

	.EQU	_SRAM_NOT_CLEAR	= 0			;NO CLEAR SRAM DURING BOOT
	.EQU	_SRAM_CLEAR	= 1			;CLEAR SRAM DURING BOOT

	;+------------------------------------------------------+
	;| T I M E R S  D E F I N I T I O N S			|
	;+------------------------------------------------------+

	.EQU	_TIMER_STOP	= 0B00000000			;timer stop
	.EQU	_TIMER_DIV_1	= 0B00000001			;timer divisor factor by 1
	.EQU	_TIMER_DIV_8	= 0B00000010			;timer divisor factor by 8
	.EQU	_TIMER_DIV_64	= 0B00000011			;timer divisor factor by 64
	.EQU	_TIMER_DIV_256	= 0B00000100			;timer divisor factor by 256
	.EQU	_TIMER_DIV_1024	= 0B00000101			;timer divisor factor by 1024
	.EQU	_TIMER_FALL	= 0B00000110			;timer Fall
	.EQU	_TIMER_RISE	= 0B00000111			;timer Rise

	;+----------------------------------------
	;| PRESCALER FACTOR FOR TIMER 0 ATMEGA128
	;+----------------------------------------
	.EQU	_TIMERM0_STOP	 = 0B00000000			;timer stop
	.EQU	_TIMERM0_DIV_1 	 = 0B00000001			;timer divisor factor by 1
	.EQU	_TIMERM0_DIV_8	 = 0B00000010			;timer divisor factor by 8
	.EQU	_TIMERM0_DIV_32	 = 0B00000011			;timer divisor factor by 32
	.EQU	_TIMERM0_DIV_64	 = 0B00000100			;timer divisor factor by 64
	.EQU	_TIMERM0_DIV_128 = 0B00000101			;timer divisor factor by 64
	.EQU	_TIMERM0_DIV_256 = 0B00000110			;timer divisor factor by 256
	.EQU	_TIMERM0_DIV_1024= 0B00000111			;timer divisor factor by 1024

	;+----------------------------------------
	;| PRESCALER FACTOR FOR TIMER 2 ATMEGA128
	;+----------------------------------------
	.EQU	_TIMERM2_STOP	 = 0B00000000			;timer stop
	.EQU	_TIMERM2_DIV_1 	 = 0B00000001			;timer divisor factor by 1
	.EQU	_TIMERM2_DIV_8	 = 0B00000010			;timer divisor factor by 8
	.EQU	_TIMERM2_DIV_32	 = 0B00000011			;timer divisor factor by 32
	.EQU	_TIMERM2_DIV_256 = 0B00000100			;timer divisor factor by 256
	.EQU	_TIMERM2_DIV_1024= 0B00000101			;timer divisor factor by 1024
	.EQU	_TIMERM2_FALL	 = 0B00000110			;timer fall
	.EQU	_TIMERM2_RISE	 = 0B00000111			;timer rise

	;+----------------------------------------
	;| PRESCALER FACTOR FOR TIMER 13 ATMEGA128
	;+----------------------------------------
	.EQU	_TIMERM13_STOP	  = 0B00000000			;timer stop
	.EQU	_TIMERM13_DIV_1   = 0B00000001			;timer divisor factor by 1
	.EQU	_TIMERM13_DIV_8	  = 0B00000010			;timer divisor factor by 8
	.EQU	_TIMERM13_DIV_64  = 0B00000011			;timer divisor factor by 64
	.EQU	_TIMERM13_DIV_256 = 0B00000100			;timer divisor factor by 256
	.EQU	_TIMERM13_DIV_1024= 0B00000101			;timer divisor factor by 1024
	.EQU	_TIMERM13_FALL    = 0B00000110			;timer FALL
	.EQU	_TIMERM13_RISE 	  = 0B00000111			;timer RISE

	;+----------------------------------------
	;| PRESCALER FACTOR ADC ATMEGA128
	;+----------------------------------------
	.EQU	_TIMERMADC_DIV_2   = 0B00000001			;timer divisor factor by 2
	.EQU	_TIMERMADC_DIV_4   = 0B00000010			;timer divisor factor by 4
	.EQU	_TIMERMADC_DIV_8   = 0B00000011			;timer divisor factor by 8
	.EQU	_TIMERMADC_DIV_16  = 0B00000100			;timer divisor factor by 16
	.EQU	_TIMERMADC_DIV_32  = 0B00000101			;timer divisor factor by 32
	.EQU	_TIMERMADC_DIV_64  = 0B00000110			;timer divisor factor by 64
	.EQU	_TIMERMADC_DIV_128 = 0B00000111			;timer divisor factor by 128

	;+----------------------------------------
	;| INTERRUPT SENSING TYPE
	;+----------------------------------------
	.EQU	_LOW_LEVEL		= 0
	.EQU	_FALLING_EDGE		= 2
	.EQU	_RISING_EDGE		= 3

	;+----------------------------------------
	;| TIMERS
	;+----------------------------------------
	.EQU	_TIMER_0		= 0
	.EQU	_TIMER_1		= 1
	.EQU	_TIMER_2		= 2
	.EQU	_TIMER_3		= 3

	;+----------------------------------------
	;| INTERRUPT SOURCE
	;+----------------------------------------
	.EQU	_EXTERNAL_0		= 0
	.EQU	_EXTERNAL_1		= 1
	.EQU	_EXTERNAL_2		= 2
	.EQU	_EXTERNAL_3		= 3
	.EQU	_EXTERNAL_4		= 4
	.EQU	_EXTERNAL_5		= 5
	.EQU	_EXTERNAL_6		= 6
	.EQU	_EXTERNAL_7		= 7

	;+----------------------------------------
	;| COMM PORTS DEFINITIONS
	;+----------------------------------------

	.EQU	COMM0			= 0
	.EQU	COMM1			= 1
	.EQU	COMM2			= 2
	.EQU	COMM3			= 3

	;+------------------------------------------------------+
	;| M A C R O  D E F I N I T I O N S			|
	;+------------------------------------------------------+

	;  +---------------------+
	;  | P W M  M A C R O S  |
	;  +---------------------+
	; /
	;|
	;| @0 	   - PWM Prescaler factor
	;| Destroy - Acc
	;| Obs:
	;| 	_PWM_XB_INIT Function Always program PWM output in normal mode
	;|	call _PWM_OUT_INVERTED macro to invert it when needed

	; ----------------
	;| INIT 8 BIT PWM |
	; ----------------

	.MACRO	_PWM_8B_INIT
		in	Acc,SREG					;Save SREG state
		cli
		push	Acc
		in	Acc,TCCR1B					;Get actual value
		andi	Acc,0b11111000					;Mask unused bits
		ori	Acc,@0						;set prescaler factor
		out	TCCR1B,Acc				
		ldi	Acc,(0<<PWM11) | (1<<PWM10) | (1<<COM1A1) | (0<<COM1A0)	;Normal PWM output 8 bits
		out	TCCR1A,Acc					;program	
		pop	Acc
		out	SREG,Acc					;restore SREG state
	.ENDMACRO

	; ----------------
	;| INIT 9 BIT PWM |
	; ----------------

	.MACRO	_PWM_9B_INIT
		in	Acc,SREG					;Save SREG state
		cli
		push	Acc
		in	Acc,TCCR1B					;Get actual value
		andi	Acc,0b11111000					;Mask unused bits
		ori	Acc,@0						;set prescaler factor
		out	TCCR1B,Acc				
		ldi	Acc,(1<<PWM11) | (0<<PWM10) | (1<<COM1A1) | (0<<COM1A0)	;Normal PWM output 9 bits
		out	TCCR1A,Acc					;program
		pop	Acc
		out	SREG,Acc					;restore SREG state
	.ENDMACRO

	; -----------------
	;| INIT 10 BIT PWM |
	; -----------------

	.MACRO	_PWM_10B_INIT
		in	Acc,SREG					;Save SREG state
		cli
		push	Acc
		in	Acc,TCCR1B					;Get actual value
		andi	Acc,0b11111000					;Mask unused bits
		ori	Acc,@0						;set prescaler factor
		out	TCCR1B,Acc				
		ldi	Acc,(1<<PWM11) | (1<<PWM10) | (1<<COM1A1) | (0<<COM1A0)	;Normal PWM output 10 bits
		out	TCCR1A,Acc					;program	
		pop	Acc
		out	SREG,Acc					;restore SREG state
	.ENDMACRO

	; --------------------------
	;| SET PWM OUTPUT AS NORMAL |
	; --------------------------

	.MACRO	_PWM_OUT_NORMAL
		in	Acc,SREG					;Save SREG state
		cli
		push	Acc
		in	Acc,TCCR1A
		andi	Acc,0b00111111					;Mask unused bits
		ori	Acc,(1<<COM1A1) | (0<<COM1A0)			;Normal output programed
		out	TCCR1A,Acc					;program	
		pop	Acc
		out	SREG,Acc					;restore SREG state
	.ENDMACRO

	; ----------------------------
	;| SET PWM OUTPUT AS INVERTED |
	; ----------------------------

	.MACRO	_PWM_OUT_INVERTED
		in	Acc,SREG					;Save SREG state
		cli
		push	Acc
		in	Acc,TCCR1A
		andi	Acc,0b00111111					;Mask unused bits
		ori	Acc,(1<<COM1A1) | (1<<COM1A0)			;Normal output programed
		out	TCCR1A,Acc					;program	
		pop	Acc
		out	SREG,Acc					;restore SREG state
	.ENDMACRO

	; ----------------------------------
	;| SEND VALUES INTO ACC:ACCH TO PWM |
	; ----------------------------------

	.MACRO	_PWM_OUT
		out	OCR1AH,AccH					;Define PWM output value
		out	OCR1AL,Acc
	.ENDMACRO

	; ------------------------------
	;| SEND IMEDIATE VALUES TO  PWM |
	;| @0 - Imetiate value input	|
	; ------------------------------

	.MACRO	_PWM_OUT_IMMEDIATE
		push	Acc
		ldi	Acc,high(@0)
		out	OCR1AH,Acc					;Define PWM output value
		ldi	Acc,low(@0)
		out	OCR1AL,Acc
		pop	Acc
	.ENDMACRO

	;  +----------------------------+
	;  | T I M E R S   M A C R O S  |
	;  +----------------------------+
	; /
	;|
	; ------------------------------
	;| TIMER 0 INITIALIZATION	|
	;| @0 - Prescaler division	|
	;| @1 - Timer division		|
	;| obs: Enable timer 0 interrupt|
	; ------------------------------

	.MACRO	_TIMER0_INIT		;Init timer 0 to count mode and enable 
		ldi	Acc,@0		;TCCR0=with prescaler factor
		out	TCCR0,Acc
		ldi	Acc,@1		;TCNT0=with division factor
		out	TCNT0,Acc
	.ENDMACRO

	;  +-----------------------------+
	;  | H A N D D L E  M A C R O S  |
	;  +-----------------------------+
	; /
	;|
	;+-----------------------------------
	;|SET HANDDLE ADDRESS ROUTINE
	;|
	;|EXAMPLE OF USE
	;|
	;|	_SET_HANDDLE _HDC_OVF0_VECT,ADDRESS_ROUTINE	;Set timer overflow 0 to jump ADDRESS_ROUTINE label
	;|
	;+-----------------------------------

	.MACRO	_SET_HANDDLE
		push	AccT		;save AccT 
		in	AccT,SREG	;save SREG state
		cli			;disable interrupts
		ldi	Acc,low(@1)	;get handdle address
		ldi	AccH,high(@1)	
		sts	@0+0,Acc	;set handdle
		sts	@0+1,AccH
		out	SREG,AccT	;restore SREG
		pop	AccT		;restore AccT
	.ENDMACRO

	;+-----------------------------------
	;|SAVE HANDDLE ADDRESS INTO SRAM OR REGISTER
	;|
	;|EXAMPLE OF USE
	;|
	;|	_SAVE_HANDDLE _HDC_OVF0_VECT,SRAM_SAVE_ADDRESS	;Set timer overflow 0 address into SRAM_SAVE_ADDRESS
	;|
	;+-----------------------------------

	.MACRO	_SAVE_HANDDLE
		push	AccT		;save AccT 
		in	AccT,SREG	;save SREG state
		cli			;disable interrupts
		lds	Acc,@0+0	;get handdle address
		lds	AccH,@0+1	
		sts	@1+0,Acc	;save handdle
		sts	@1+1,AccH
		out	SREG,AccT	;restore SREG
		pop	AccT		;restore AccT
	.ENDMACRO

	;+-----------------------------------
	;|CALL HANDDLE ADDRESS INTO SRAM OR REGISTER
	;|
	;|EXAMPLE OF USE
	;|
	;|	_CALL_HANDDLE SRAM_HANDDLE_ADDRESS		;call routine address SRAM_HANDDLE_ADDRESS
	;|
	;+-----------------------------------

	.MACRO	_CALL_HANDDLE
		lds	ZL,@0+0			;get handdle address into sram
		lds	ZH,@0+1
		icall				;call 
	.ENDMACRO
	
	;+-----------------------------------
	;|LOAD IMEDIATE POINTER REGISTERS
	;+-----------------------------------

	.MACRO	LDIAW				;load ACC register with imediate value word
		ldi	Acc,low(@0)
		ldi	AccH,high(@0)
	.ENDMACRO

	.MACRO	LDIAWT				;load ACCT register with imediate value word
		ldi	AccT,low(@0)
		ldi	AccTH,high(@0)
	.ENDMACRO

	.MACRO	LDIAL				;load ACCT register with imediate value long
		ldi	Acc,low(lwrd(@0))
		ldi	AccH,high(lwrd(@0))
		ldi	AccT,low(hwrd(@0))
		ldi	AccTH,high(hwrd(@0))
	.ENDMACRO

	.MACRO	LDIX				;load X register with imediate value
		ldi	XL,low(@0)
		ldi	XH,high(@0)
	.ENDMACRO

	.MACRO	LDIY				;load Y register with imediate value
		ldi	YL,low(@0)
		ldi	YH,high(@0)
	.ENDMACRO

	.MACRO	LDIZ				;load Z register with imediate value
		ldi	ZL,low(@0)
		ldi	ZH,high(@0)
	.ENDMACRO

	;+-----------------------------------
	;| CLEAR REGISTER WORD 
	;+-----------------------------------
	;
	;	clrw	valid registers X,Y,Z

	.MACRO	clrw
		clr	@0L
		clr	@0H
	.ENDMACRO

	;+-----------------------------------
	;| LOAD IMEDIATE REGISTER WORD INTO REGISTER PAIR
	;+-----------------------------------
	;
	;	ldiw	Z,var valid registers X,Y,Z

	.MACRO	ldiw
		ldi	@0L,low(@1)
		ldi	@0H,high(@1)
	.ENDMACRO

	;+-----------------------------------
	;| LOAD MEMORY WORD INTO AccH:Acc
	;+-----------------------------------
	;
	;	ldsaw	mem

	.MACRO	ldsaw
		lds	Acc,@0
		lds	AccH,@0+1
	.ENDMACRO

	;+-----------------------------------
	;| LOAD MEMORY WORD INTO AccH:Acc with index
	;+-----------------------------------
	;
	;	lddaw	[X,Y,Z],offset

	.MACRO	lddaw
		ldd	Acc,@0+@1
		ldd	AccH,@0+@1+1
	.ENDMACRO

	;+-----------------------------------
	;| LOAD MEMORY WORD INTO ACCTH:AccT
	;+-----------------------------------
	;
	;	ldsawt	mem

	.MACRO	ldsawt
		lds	AccT,@0
		lds	AccTH,@0+1
	.ENDMACRO

	;+-----------------------------------
	;| LOAD MEMORY WORD INTO ACCTH:AccT with index
	;+-----------------------------------
	;
	;	lddawt	[X,Y,Z],index

	.MACRO	lddawt
		ldd	AccT,@0+@1
		ldd	AccTH,@0+@1+1
	.ENDMACRO

	;+-----------------------------------
	;| LOAD MEMORY WORD INTO REGISTER PAIR
	;+-----------------------------------
	;
	;	ldsw	Z,mem valid registers X,Y,Z

	.MACRO	ldsw
		lds	@0L,@1
		lds	@0H,@1+1
	.ENDMACRO

	;+-----------------------------------
	;| LOAD MEMORY WORD INTO REGISTER PAIR indexed
	;+-----------------------------------
	;
	;	lddw	Z,mem valid registers X,Y,Z,index

	.MACRO	lddw
		ldd	@0L,@1+@2
		ldd	@0H,@1+@2+1
	.ENDMACRO

⌨️ 快捷键说明

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