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 + -
显示快捷键?