iar_stack.s51

来自「8051试验程序 基础教材」· S51 代码 · 共 1,666 行 · 第 1/3 页

S51
1,666
字号
;-----------------------------------------------------------------------------
	MODULE	?EXT_STACK_DISP16
	RSEG	EXT_STACK:NOROOT:XDATA
	RSEG	RCODE:CODE:NOROOT
	PUBLIC	?EXT_STACK_DISP0_16
#if (__NUMBER_OF_DPTRS__ > 1)
	PUBLIC	?EXT_STACK_DISP1_16
#endif
#if (__NUMBER_OF_DPTRS__ > 2)
	PUBLIC	?EXT_STACK_DISP2_16
#endif
#if (__NUMBER_OF_DPTRS__ > 3)
	PUBLIC	?EXT_STACK_DISP3_16
#endif
#if (__NUMBER_OF_DPTRS__ > 4)
	PUBLIC	?EXT_STACK_DISP4_16
#endif
#if (__NUMBER_OF_DPTRS__ > 5)
	PUBLIC	?EXT_STACK_DISP5_16
#endif
#if (__NUMBER_OF_DPTRS__ > 6)
	PUBLIC	?EXT_STACK_DISP6_16
#endif
#if (__NUMBER_OF_DPTRS__ > 7)
	PUBLIC	?EXT_STACK_DISP7_16
#endif
	EXTERN	?ESP
	EXTERNS_FOR_ALL_DPTR_SYMBOLS()

    cfi BLOCK ?EXT_STACK_DISP16 USING cfi_common
    cfi NOFUNCTION

#if ( (__NUMBER_OF_DPTRS__ == 1) || ((__NUMBER_OF_DPTRS__ > 1) && (defined ( __DPTR_SHADOWED__ ))))
?EXT_STACK_DISP0_16:
?EXT_STACK_DISP1_16:
?EXT_STACK_DISP2_16:
?EXT_STACK_DISP3_16:
?EXT_STACK_DISP4_16:
?EXT_STACK_DISP5_16:
?EXT_STACK_DISP6_16:
?EXT_STACK_DISP7_16:
	XCH	A,DPL
	ADD	A,SP
	XCH	A,DPL
	XCH	A,DPH
	ADDC	A,?ESP
	ANL	A,#0x03         ; Maks out relevant ESP bits.
	ORL     A,#(HIGH(sfb(EXT_STACK)) & 0xFC)
	XCH	A,DPH
#ifdef __EXTENDED_DPTR__
	MOV     ?DPX,#BYTE3(sfb(EXT_STACK))
#endif
	RET

#elif __DPTR_SEPARATE__

?EXT_STACK_DISP0_16:
	XCH	A,DPL
	ADD	A,SP
	XCH	A,DPL
	XCH	A,DPH
	ADDC	A,?ESP
	ANL	A,#0x03         ; Maks out relevant ESP bits.
	ORL     A,#(HIGH(sfb(EXT_STACK)) & 0xFC)
	XCH	A,DPH
#ifdef __EXTENDED_DPTR__
	MOV     ?DPX,#BYTE3(sfb(EXT_STACK))
#endif
	RET

EXT_STACK_DISP16 MACRO nr
	XCH	A,?DPL\1
	ADD	A,SP
	XCH	A,?DPL\1
	XCH	A,?DPH\1
	ADDC	A,?ESP
	ANL	A,#0x03         ; Maks out relevant ESP bits.
	ORL     A,#(HIGH(sfb(EXT_STACK)) & 0xFC)
	XCH	A,?DPH\1
#ifdef __EXTENDED_DPTR__
	MOV     ?DPX\1,#BYTE3(sfb(EXT_STACK))
#endif
	RET
        ENDM

#if (__NUMBER_OF_DPTRS__ > 1)
?EXT_STACK_DISP1_16:
	EXT_STACK_DISP16 1
#endif
#if (__NUMBER_OF_DPTRS__ > 2)
?EXT_STACK_DISP2_16:
	EXT_STACK_DISP16 2
#endif
#if (__NUMBER_OF_DPTRS__ > 3)
?EXT_STACK_DISP3_16:
	EXT_STACK_DISP16 3
#endif
#if (__NUMBER_OF_DPTRS__ > 4)
?EXT_STACK_DISP4_16:
	EXT_STACK_DISP16 4
#endif
#if (__NUMBER_OF_DPTRS__ > 5)
?EXT_STACK_DISP5_16:
	EXT_STACK_DISP16 5
#endif
#if (__NUMBER_OF_DPTRS__ > 6)
?EXT_STACK_DISP6_16:
	EXT_STACK_DISP16 6
#endif
#if (__NUMBER_OF_DPTRS__ > 7)
?EXT_STACK_DISP7_16:
	EXT_STACK_DISP16 7
#endif

#else
#error "You must define __DPTR_SHADOWED__ or __DPTR_SEPARATE__"
#endif

    cfi ENDBLOCK ?EXT_STACK_DISP16
	ENDMOD


;-----------------------------------------------------------------------------
;
;	Functions: Allocate and de-allocate memory on the XDATA stack
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;
;	Function: ?ALLOC_XSTACK8
;
;	Description:
;		Allocate an area of size 1 to 256 bytes on the XDATA stack.
;
;		+--------+
;		| -FF(A) |
;		+--------+ <-- XSTACK
;
;
;	Register input:
;		A  -(Size of the wanted xstack area)
;
;	Register output:
;		XSTACK = XSTACK + FF(A)
;		A      = XSP_L
;		CY       Undefined.
;
;	NOTE:
;		DPTR/DPS: unchanged
;
;	Stack usage: 3
;
;-----------------------------------------------------------------------------
	MODULE	?ALLOC_XSTACK8
	RSEG	RCODE:CODE:NOROOT
	PUBLIC	?ALLOC_XSTACK8
	EXTERN	?XSP
	EXTERNS_FOR_ALL_DPTR_SYMBOLS()

    cfi BLOCK ?ALLOC_XSTACK8 USING cfi_common
    cfi NOFUNCTION
    cfi CFA_SPX sub(SPX,sub(256,A))
?ALLOC_XSTACK8
?ALLOC_XSTACK8_CFI_INVALID_BEGINS:
    cfi invalid
	ADD	A,XSP_L
	;; Disable interrupts for max 6 cycles
	JBC	0xA8.7 /* IE.EA */, interrupts_disabled
	MOV	XSP_L,A
	JC	NoBorrow1
	DEC	XSP_H
NoBorrow1:		
	SJMP	finished
interrupts_disabled:
	MOV	XSP_L,A
	JC	NoBorrow2
	DEC	XSP_H
NoBorrow2:
	;; Enable interrupts
	SETB	0xA8.7 /* IE.EA */
finished:		
    cfi CFA_SPX SPX
	RET
?ALLOC_XSTACK8_CFI_INVALID_ENDS:
    cfi valid

    cfi ENDBLOCK ?ALLOC_XSTACK8
	ENDMOD

;-----------------------------------------------------------------------------
;
;	Function: ?DEALLOC_XSTACK8
;
;	Description:
;		Deallocate an area of size 1 to 255 bytes on the XDATA stack.
;
;		+--------+
;		|  00(A) |
;		+--------+ <-- XSTACK
;
;
;	Register input:
;		A  Size of the xstack area to deallocate
;
;	Register output:
;		XSTACK = XSTACK + 00(A)
;		A      = XSP_L
;
;       NOTE:
;               DPTR/DPS: unchanged
;
;	Stack usage: 3
;
;-----------------------------------------------------------------------------
	MODULE	?DEALLOC_XSTACK8
	RSEG	RCODE:CODE:NOROOT
	PUBLIC	?DEALLOC_XSTACK8
	EXTERN	?XSP
	EXTERNS_FOR_ALL_DPTR_SYMBOLS()

    cfi BLOCK ?DEALLOC_XSTACK8 USING cfi_common
    cfi NOFUNCTION

?DEALLOC_XSTACK8:
?DEALLOC_XSTACK8_CFI_INVALID_BEGINS:
    cfi invalid
	PUSH	PSW                 ; Preserve carry
	ADD	A,XSP_L
	;; Disable interrupts for max 6 cycles
	JBC	0xA8.7 /* IE.EA */, interrupts_disabled
	MOV	XSP_L,A
	JNC	NoBorrow1
	INC	XSP_H
NoBorrow1:		
	SJMP	finished
interrupts_disabled:
	MOV	XSP_L,A
	JNC	NoBorrow2
	INC	XSP_H
NoBorrow2:
	;; Enable interrupts
	SETB	0xA8.7 /* IE.EA */
finished:		
	POP	PSW
    cfi CFA_MACHINE MACHINE_SP - 2
	RET
?DEALLOC_XSTACK8_CFI_INVALID_ENDS:
    cfi valid
    cfi ENDBLOCK ?DEALLOC_XSTACK8
	ENDMOD

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;
;	Function: ?ADD_XSTACK_DISP8
;
;	Description:
;              Allocates an area of max 256 bytes and return the tos in DPTR
;
;              FFFF
;               :
;		+------+
;		| xxxx | <-- pre XSP
;		|   :  | -
;		|   :  |  |
;		|   :  |  | -A
;		|   :  |  |
;		|   :  | -  <-- post XSP, post DPTR
;		+------+
;               :
;               0
;
;	Register input:
;		A      = -(Size of the wanted xstack area)
;
;	Register output:
;		XSTACK = XSP + A (note A is negative)
;		DPTR   = XSP (new)
;		A      = XSP_L
;		CY       Undefined.
;
;       Multiple DPTR
;               Shadowed:       Requires DPTR: none     Requires DPS: DPTRx
;                               Modifies DPTR: DPTRx    Returns  DPS: DPTRx
;
;               Separate:       Requires DPTR: 0        Requires DPS: none
;                               Modifies DPTR: 0        Returns  DPS: none
;
;	Stack usage: 3
;
;-----------------------------------------------------------------------------
	MODULE	?ADD_XSTACK_DISP8
        RSEG	XSTACK:NOROOT:XDATA
	RSEG	RCODE:CODE:NOROOT
	PUBLIC	?ADD_XSTACK_DISP0_8
	EXTERN	?XSP
	EXTERNS_FOR_ALL_DPTR_SYMBOLS()

    cfi BLOCK ?ADD_XSTACK_DISP8 USING cfi_common
    cfi NOFUNCTION

?ADD_XSTACK_DISP0_8:
?ADD_XSTACK_DISP0_8_CFI_INVALID_BEGINS:
    cfi invalid
	ADD	A,XSP_L
	MOV	DPL,A
	;; Disable interrupts for max 6 cycles
	JBC	0xA8.7 /* IE.EA */, interrupts_disabled
	MOV	XSP_L,A
	JC	NoBorrow1
	DEC	XSP_H
NoBorrow1:
	SJMP	finished
interrupts_disabled:
	MOV	XSP_L,A
	JC	NoBorrow2
	DEC	XSP_H
NoBorrow2:
	;; Enable interrupts
	SETB	0xA8.7 /* IE.EA */
finished:	
	MOV	DPH,XSP_H
#if (defined (__EXTENDED_DPTR__ ))
	MOV	?DPX,#BYTE3(sfb(XSTACK))
#endif
	RET
?ADD_XSTACK_DISP0_8_CFI_INVALID_ENDS:
    cfi valid

    cfi ENDBLOCK ?ADD_XSTACK_DISP8
	ENDMOD

;-----------------------------------------------------------------------------
;
;	Function: ?ADD_XSTACK_DISP16
;
;	Description:
;		Add a 16-bit value to the XDATA stack-pointer.
;		Can be used for allocating or deallocating stack.
;
;		+--------+
;		|  DPTR  |
;		+--------+ <-- XSTACK
;
;
;	Register input:
;		DPTR  Size of the xstack area to allocate/deallocate
;
;	Register output:
;		XSTACK = XSTACK + DPTR
;		DPTR   = XSTACK
;		CY       Undefined.
;
;       Multiple DPTR
;               Shadowed:       Requires DPTR: none     Requires DPS: DPTRx
;                               Modifies DPTR: DPTRx    Returns  DPS: DPTRx
;
;               Separate:       Requires DPTR: 0        Requires DPS: none
;                               Modifies DPTR: 0        Returns  DPS: none
;
;	Stack usage: 3
;
;-----------------------------------------------------------------------------
	MODULE	?ADD_XSTACK_DISP16
    RSEG	XSTACK:NOROOT:XDATA
	RSEG	RCODE:CODE:NOROOT
	PUBLIC	?ADD_XSTACK_DISP0_16
	EXTERN	?XSP
	EXTERNS_FOR_ALL_DPTR_SYMBOLS()

    cfi BLOCK ?ADD_XSTACK_DISP16 Using cfi_common
    cfi NOFUNCTION

?ADD_XSTACK_DISP0_16
?ADD_XSTACK_DISP0_16_CFI_INVALID_BEGINS:
    cfi invalid
	XCH	A,DPL
	ADD	A,XSP_L
	XCH	A,DPL
	XCH	A,DPH
	ADDC	A,XSP_H
	;; Disable interrupts for max 7 cycles
	JBC	0xA8.7 /* IE.EA */, interrupts_disabled
	MOV	XSP_H,A
	MOV	XSP_L,DPL
	SJMP	finished
interrupts_disabled:	
	MOV	XSP_H,A
	MOV	XSP_L,DPL	
	;; Enable interrupts
	SETB	0xA8.7 /* IE.EA */
finished:
	XCH	A,DPH
#if (defined (__EXTENDED_DPTR__ ))
	MOV	?DPX,#BYTE3(sfb(XSTACK))
#endif
	RET
?ADD_XSTACK_DISP0_16_CFI_INVALID_ENDS:
    cfi valid
    cfi ENDBLOCK ?ADD_XSTACK_DISP16
	ENDMOD

;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;
;	Function: ?XSTACK_DISP8
;
;	Description:
;	       Get a pointer to a specific object on the stack at offset X.
;
;              FFFF
;               :
;		+------+
;		| xxxx | <-- DPTRnr
;		|   :  | -
;		|   :  |  |
;		|   :  |  | Displacement (A)
;		|   :  |  |
;		|   :  | -  <-- XSP
;		+------+
;               :
;               0
;
;	Register input:
;		A     = 8-bit positive offset
;               DPSEL = DPTRx (where x same as entry nr, only for shadowed)
;
;	Register output:
;		DPTRx = XSP + A
;               DPSEL  = Same as input
;		A      = DPH
;
;       Multiple DPTR
;               Shadowed:       Requires DPTR: none     Requires DPS: DPTRx
;                               Modifies DPTR: DPTRx    Returns  DPS: DPTRx
;
;               Separate:       Requires DPTR: none     Requires DPS: none
;                               Modifies DPTR: DPTRx    Returns  DPS: none
;
;	Stack usage: 2
;
;-----------------------------------------------------------------------------
	MODULE	?XSTACK_DISP8
    RSEG	XSTACK:NOROOT:XDATA
	RSEG	RCODE:CODE:NOROOT
	EXTERN	?XSP
	EXTERNS_FOR_ALL_DPTR_SYMBOLS()

	PUBLIC	?XSTACK_DISP0_8
#if (__NUMBER_OF_DPTRS__ > 1)
	PUBLIC	?XSTACK_DISP1_8
#endif
#if (__NUMBER_OF_DPTRS__ > 2)
	PUBLIC	?XSTACK_DISP2_8
#endif
#if (__NUMBER_OF_DPTRS__ > 3)
	PUBLIC	?XSTACK_DISP3_8
#endif
#if (__NUMBER_OF_DPTRS__ > 4)
	PUBLIC	?XSTACK_DISP4_8
#endif
#if (__NUMBER_OF_DPTRS__ > 5)
	PUBLIC	?XSTACK_DISP5_8
#endif
#if (__NUMBER_OF_DPTRS__ > 6)
	PUBLIC	?XSTACK_DISP6_8
#endif
#if (__NUMBER_OF_DPTRS__ > 7)
	PUBLIC	?XSTACK_DISP7_8
#endif
    cfi BLOCK ?XSTACK_DISP8 USING cfi_common
    cfi NOFUNCTION

#if ( (__NUMBER_OF_DPTRS__ == 1) || ((__NUMBER_OF_DPTRS__ > 1) && (defined ( __DPTR_SHADOWED__ ))))
?XSTACK_DISP0_8:
?XSTACK_DISP1_8:
?XSTACK_DISP2_8:
?XSTACK_DISP3_8:
?XSTACK_DISP4_8:
?XSTACK_DISP5_8:
?XSTACK_DISP6_8:
?XSTACK_DISP7_8:
	ADD	A,XSP_L
	MOV	DPL,A
	CLR	A
	ADDC	A,XSP_H
	MOV	DPH,A
#if (defined (__EXTENDED_DPTR__ ))
	MOV	?DPX,#BYTE3(sfb(XSTACK))
#endif
	RET

#elif __DPTR_SEPARATE__

?XSTACK_DISP0_8:
	ADD	A,XSP_L
	MOV	DPL,A
	CLR	A
	ADDC	A,XSP_H
	MOV	DPH,A
#if (defined (__EXTENDED_DPTR__ ))
	MOV	?DPX,#BYTE3(sfb(XSTACK))
#endif
	RET

#if (__NUMBER_OF_DPTRS__ > 1)
?XSTACK_DISP1_8:
	ADD	A,XSP_L
	MOV	?DPL1,A
	CLR	A
	ADDC	A,XSP_H
	MOV	?DPH1,A
#if (defined (__EXTENDED_DPTR__ ))
	MOV	?DPX1,#BYTE3(sfb(XSTACK))
#endif
	RET
#endif

#if (__NUMBER_OF_DPTRS__ > 2)
?XSTACK_DISP2_8:
	ADD	A,XSP_L
	MOV	?DPL2,A
	CLR	A
	ADDC	A,XSP_H
	MOV	?DPH2,A
#if (defined (__EXTENDED_DPTR__ ))
	MOV	?DPX2,#BYTE3(sfb(XSTACK))
#endif
	RET
#endif

#if (__NUMBER_OF_DPTRS__ > 3)
?XSTACK_DISP3_8:
	ADD	A,XSP_L
	MOV	?DPL3,A
	CLR	A
	ADDC	A,XSP_H
	MOV	?DPH3,A
#if (defined (__EXTENDED_DPTR__ ))
	MOV	?DPX3,#BYTE3(sfb(XSTACK))
#endif
	RET
#endif

#if (__NUMBER_OF_DPTRS__ > 4)
?XSTACK_DISP4_8:
	ADD	A,XSP_L
	MOV	?DPL4,A
	CLR	A
	ADDC	A,XSP_H
	MOV	?DPH4,A
#if (defined (__EXTENDED_DPTR__ ))
	MOV	?DPX4,#BYTE3(sfb(XSTACK))
#endif
	RET
#endif

#if (__NUMBER_OF_DPTRS__ > 5)
?XSTACK_DISP5_8:

⌨️ 快捷键说明

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