cmain.s51
来自「8051试验程序 基础教材」· S51 代码 · 共 831 行 · 第 1/2 页
S51
831 行
MOV DPH,R3
MOVX @DPTR,A
INC DPTR
MOV R2,DPL
MOV R3,DPH
MOV DPL,R4
MOV DPH,R5
XDATA_INIT_TEST:
DJNZ R0,XDATA_INIT
DJNZ R1,XDATA_INIT
//------------------------------------------------------------------------
//
// Initializise the IXDATA_I segment
//
RSEG IXDATA_I:XDATA:NOROOT
RSEG IXDATA_ID:CODE:NOROOT
RSEG CSTART:CODE:NOROOT
PUBLIC __INIT_IXDATA_I
__INIT_IXDATA_I:
MOV DPTR,#sfb(IXDATA_I)
#if (defined(__EXTENDED_DPTR__) && ( __CORE__ != __CORE_EXTENDED1__ ))
MOV ?DPX,#0
#endif
MOV R2,DPL
MOV R3,DPH
MOV DPTR,#sfb(IXDATA_ID)
MOV R0,#(low(sizeof(IXDATA_I) + 1))
MOV R1,#(high(sizeof(IXDATA_I) + 0x0100))
SJMP IXDATA_INIT_TEST
IXDATA_INIT:
CLR A
MOVC A,@A+DPTR
INC DPTR
MOV R4,DPL
MOV R5,DPH
MOV DPL,R2
MOV DPH,R3
MOVX @DPTR,A
INC DPTR
MOV R2,DPL
MOV R3,DPH
MOV DPL,R4
MOV DPH,R5
IXDATA_INIT_TEST:
DJNZ R0,IXDATA_INIT
DJNZ R1,IXDATA_INIT
//------------------------------------------------------------------------
//
// Initializise the FAR_I segment
//
#if (defined(__EXTENDED_DPTR__))
#if (__NUMBER_OF_DPTRS__ == 1)
//
// One data pointer
//
RSEG FAR_I:XDATA:NOROOT
RSEG FAR_ID:CODE:NOROOT
RSEG CSTART:CODE:NOROOT
PUBLIC __INIT_FAR_I
__INIT_FAR_I:
MOV R2,#LOW(sfb(FAR_I))
MOV R3,#BYTE2(sfb(FAR_I))
MOV R4,#BYTE3(sfb(FAR_I))
#if ( __CORE__ == __CORE_EXTENDED1__ )
MOV DPTR,#sfb(FAR_ID)
#else
MOV DPL,#LOW(sfb(FAR_ID))
MOV DPH,#BYTE2(sfb(FAR_ID))
MOV ?DPX,#BYTE3(sfb(FAR_ID))
#endif
MOV R0,#(low(sizeof(FAR_I) + 1))
MOV R1,#(high(sizeof(FAR_I) + 0x0100))
SJMP FAR_INIT_TEST
FAR_INIT:
CLR A
MOVC A,@A+DPTR
INC DPTR
MOV R5,DPL
MOV R6,DPH
MOV R7,?DPX
MOV DPL,R2
MOV DPH,R3
MOV ?DPX,R4
MOVX @DPTR,A
INC DPTR
MOV R2,DPL
MOV R3,DPH
MOV R4,?DPX
MOV DPL,R5
MOV DPH,R6
MOV ?DPX,R7
FAR_INIT_TEST:
DJNZ R0,FAR_INIT
DJNZ R1,FAR_INIT
#elif (__NUMBER_OF_DPTRS__ > 1)
//
// two data pointers
//
RSEG FAR_I:XDATA:NOROOT
RSEG FAR_ID:CODE:NOROOT
RSEG CSTART:CODE:NOROOT
PUBLIC __INIT_FAR_I
__INIT_FAR_I:
#ifdef __DPTR_SHADOWED__
//
// Shadowed dptrs (two data pointers)
//
MOV DPL,#LOW(sfb(FAR_I))
MOV DPH,#BYTE2(sfb(FAR_I))
MOV ?DPX,#BYTE3(sfb(FAR_I))
TOGGLE_DPTR
MOV DPL,#LOW(sfb(FAR_ID))
MOV DPH,#BYTE2(sfb(FAR_ID))
MOV ?DPX,#BYTE3(sfb(FAR_ID))
; <- DPTR1 active
#else ; __DPTR_SEPARATE__
//
// Separate dptrs (two data pointers)
//
#if ( __CORE__ == __CORE_EXTENDED1__ )
MOV DPTR,#sfb(FAR_I)
#else
MOV DPL,#LOW(sfb(FAR_I))
MOV DPH,#BYTE2(sfb(FAR_I))
MOV ?DPX,#BYTE3(sfb(FAR_I))
#endif
#if ( __CORE__ == __CORE_EXTENDED1__ )
TOGGLE_DPTR
MOV DPTR,#sfb(FAR_ID)
#else
MOV ?DPL1,#LOW(sfb(FAR_ID))
MOV ?DPH1,#BYTE2(sfb(FAR_ID))
MOV ?DPX1,#BYTE3(sfb(FAR_ID))
TOGGLE_DPTR
#endif
; <- DPTR1 active
#endif
MOV R0,#(low(sizeof(FAR_I) + 1))
MOV R1,#(high(sizeof(FAR_I) + 0x0100))
SJMP FAR_INIT_TEST
; <- DPTR1 active
FAR_INIT:
CLR A
MOVC A,@A+DPTR
INC DPTR
TOGGLE_DPTR
MOVX @DPTR,A
INC DPTR
TOGGLE_DPTR
FAR_INIT_TEST:
DJNZ R0,FAR_INIT
DJNZ R1,FAR_INIT
SELECT_DPTR0
#else
#error "You must define __NUMBER_OF_DPTRS__"
#endif
#endif ; __EXTENDED_DPTR__
//------------------------------------------------------------------------
//
// Initializise the HUGE_I segment
//
#if (defined(__EXTENDED_DPTR__))
#if (__NUMBER_OF_DPTRS__ == 1)
//
// One data pointer
//
RSEG HUGE_I:XDATA:NOROOT
RSEG HUGE_ID:CODE:NOROOT
RSEG CSTART:CODE:NOROOT
PUBLIC __INIT_HUGE_I
__INIT_HUGE_I:
MOV R2,#LOW(sfb(HUGE_I))
MOV R3,#BYTE2(sfb(HUGE_I))
MOV R4,#BYTE3(sfb(HUGE_I))
#if ( __CORE__ == __CORE_EXTENDED1__ )
MOV DPTR,#sfb(HUGE_ID)
#else
MOV DPL,#LOW(sfb(HUGE_ID))
MOV DPH,#BYTE2(sfb(HUGE_ID))
MOV ?DPX,#BYTE3(sfb(HUGE_ID))
#endif
MOV R0,#(LOW(sizeof(HUGE_I) + 1))
MOV R1,#(BYTE2(sizeof(HUGE_I) + 0x000100))
MOV B,#(BYTE3(sizeof(HUGE_I) + 0x010000))
SJMP HUGE_INIT_TEST
HUGE_INIT:
CLR A
MOVC A,@A+DPTR
INC DPTR
MOV R5,DPL
MOV R6,DPH
MOV R7,?DPX
MOV DPL,R2
MOV DPH,R3
MOV ?DPX,R4
MOVX @DPTR,A
INC DPTR
MOV R2,DPL
MOV R3,DPH
MOV R4,?DPX
MOV DPL,R5
MOV DPH,R6
MOV ?DPX,R7
HUGE_INIT_TEST:
DJNZ R0,HUGE_INIT
DJNZ R1,HUGE_INIT
DJNZ B,HUGE_INIT
#elif (__NUMBER_OF_DPTRS__ > 1)
//
// Two data pointer
//
RSEG HUGE_I:XDATA:NOROOT
RSEG HUGE_ID:CODE:NOROOT
RSEG CSTART:CODE:NOROOT
PUBLIC __INIT_HUGE_I
__INIT_HUGE_I:
#ifdef __DPTR_SHADOWED__
//
// Shadowed dptrs (two data pointers)
//
MOV DPL,#LOW(sfb(HUGE_I))
MOV DPH,#BYTE2(sfb(HUGE_I))
MOV ?DPX,#BYTE3(sfb(HUGE_I))
TOGGLE_DPTR
MOV DPL,#LOW(sfb(HUGE_ID))
MOV DPH,#BYTE2(sfb(HUGE_ID))
MOV ?DPX,#BYTE3(sfb(HUGE_ID))
; ; <- DPTR1 active
#else ; __DPTR_SEPARATE__
//
// Separate dptrs (two data pointers)
//
#if ( __CORE__ == __CORE_EXTENDED1__ )
MOV DPTR,#sfb(HUGE_I)
#else
MOV DPL,#LOW(sfb(HUGE_I))
MOV DPH,#BYTE2(sfb(HUGE_I))
MOV ?DPX,#BYTE3(sfb(HUGE_I))
#endif
#if ( __CORE__ == __CORE_EXTENDED1__ )
TOGGLE_DPTR
MOV DPTR,#sfb(HUGE_ID)
#else
MOV ?DPL1,#LOW(sfb(HUGE_ID))
MOV ?DPH1,#BYTE2(sfb(HUGE_ID))
MOV ?DPX1,#BYTE3(sfb(HUGE_ID))
; switch to DPRT1
TOGGLE_DPTR
#endif
; <- DPTR1 active
#endif
MOV R0,#(LOW(sizeof(HUGE_I) + 1))
MOV R1,#(BYTE2(sizeof(HUGE_I) + 0x000100))
MOV R2,#(BYTE3(sizeof(HUGE_I) + 0x010000))
SJMP HUGE_INIT_TEST
; <- DPTR1 active
HUGE_INIT:
CLR A
MOVC A,@A+DPTR
INC DPTR
TOGGLE_DPTR
MOVX @DPTR,A
INC DPTR
TOGGLE_DPTR
HUGE_INIT_TEST:
DJNZ R0,HUGE_INIT
DJNZ R1,HUGE_INIT
DJNZ R2,HUGE_INIT
SELECT_DPTR0
#else
#error "You must define __NUMBER_OF_DPTRS__"
#endif
#endif ;__EXTENDED_DPTR__ far/huge initialized data
__skip_segment_init:
// --------------------------------------------------------------
// Call constructors of static objects.
// ====================================
//
// This code will only be used if any EC++
// modules defines global objects that need to
// have its constructor called before main.
//
//---------------------------------------------------------------
#if (defined(__DLIB_BUILD__) )
RSEG DIFUNCT:CODE:ROOT
XRSEGCSTART
EXTERN __cstart_call_ctors
PUBLIC ?cstart_call_ctors
?cstart_call_ctors:
#if (__CODE_MODEL__ == __CM_BANKED__)
EXTERN ?BCALL
MOV DPL,#BYTE1(__cstart_call_ctors)
MOV DPH,#BYTE2(__cstart_call_ctors)
#ifdef __EXTENDED_DPTR__
MOV ?DPX,#0
#endif
MOV A,#BYTE3(__cstart_call_ctors)
LCALL ?BCALL
#elif (__CORE__ == __CORE_EXTENDED2__ )
EXTERN ?MEX1
MOV ?MEX1, #BYTE3(__cstart_call_ctors)
LCALL __cstart_call_ctors & 0xFFFF
#else
LCALL __cstart_call_ctors
#endif
#endif ; __DLIB_BUILD__
// -----------------------------------------------
// Call main() with no arguments and then exit using the return value
// of main as the parameter.
//
XRSEGCSTART
PUBLIC ?call_main
?call_main:
#if ( __CODE_MODEL__ == __CM_BANKED__)
EXTERN ?BCALL
MOV DPL,#low(main)
MOV DPH,#high(main)
#ifdef __EXTENDED_DPTR__
MOV ?DPX,#0
#endif
MOV A,#BYTE3(main)
LCALL ?BCALL // call main
MOV DPL,#low(exit)
MOV DPH,#high(exit)
#ifdef __EXTENDED_DPTR__
MOV ?DPX,#0
#endif
MOV A,#BYTE3(exit)
LCALL ?BCALL // call exit
#elif (__CODE_MODEL__ == __CM_BANKED_EXT2__)
EXTERN ?MEX1
EXTERN ?RESTORE_MCB
MOV ?MEX1,#0
LCALL ?RESTORE_MCB
MOV ?MEX1,#BYTE3(main)
LCALL main & 0xFFFF
MOV ?MEX1, #BYTE3(exit)
LCALL exit & 0xFFFF
#else
LCALL main
LCALL exit
#endif
ENDMOD
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?