cmain.s51

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

S51
831
字号
/*******************************************************************************
 *
 * System initialization code for the 8051 IAR Systems C/EC++ Compiler.
 *
 * Copyright 2004-2005 IAR Systems. All rights reserved.
 *
 * $Revision: 4427 $
 *
 ******************************************************************************/

#include "iar_common.h"

        EXTERNS_FOR_ALL_DPTR_SYMBOLS()


#define XRSEGCSTART RSEG CSTART:CODE:NOROOT

        MODULE ?cmain

        EXTERN  main             ; Where to begin execution
        EXTERN  exit             ; Where to go when done


//----------------------------------------------------------------------
//
// Catch jump from cstartup.s51
//
//----------------------------------------------------------------------

        XRSEGCSTART
        PUBLIC  ?cmain
        REQUIRE ?call_main

?cmain:

//------------------------------------------------------------------------
//
// Call __low_level_init to perform initialization before initializing
// segments and calling main. If the function returns 0 no segment
// initialization should take place.
//
// Link with your own version of __low_level_init to override the
// default action: to do nothing but return 1.
//
//------------------------------------------------------------------------

        RSEG	CSTART:CODE:NOROOT
	EXTERN	__low_level_init
        PUBLIC	__low_level_init_call

__low_level_init_call:

        LCALL   __low_level_init
	CJNE	R1,#0,__init_segments

        //-------------------------------------------------------
        //
        // Jump to the code that performs the rest of the system
        // initialization before calling main().
        //
        //-------------------------------------------------------

	LJMP	__skip_segment_init	; skip segment initialization


//------------------------------------------------------------------------
//
// Segment initialization:
//
// Initialization for unused segments will not be included in the code
//
// xxx_Z  -- uninitialized data that are filled with zeros.
// xxx_I  -- initialized data that gets the values from the corresponding
//           xxx_ID segment.
//
//------------------------------------------------------------------------

__init_segments:


//------------------------------------------------------------------------
//
// Clear the BDATA_Z segment
//

	RSEG    BDATA_Z:DATA:NOROOT
	RSEG    CSTART:CODE:NOROOT
	PUBLIC	__INIT_BDATA_Z

__INIT_BDATA_Z:
	CLR	A
	MOV	R1,#sfb(BDATA_Z)
	MOV	R0,#sizeof(BDATA_Z)
	CJNE	R0,#0,BDATA_ZERO
	SJMP	BDATA_ZERO_OUT
BDATA_ZERO:
	MOV    	@R1,A
	INC	R1
	DJNZ	R0,BDATA_ZERO
BDATA_ZERO_OUT:


//------------------------------------------------------------------------
//
// Clear the DATA_Z segment
//

	RSEG    DATA_Z:DATA:NOROOT
	RSEG    CSTART:CODE:NOROOT
	PUBLIC	__INIT_DATA_Z

__INIT_DATA_Z:
	CLR	A
	MOV	R1,#sfb(DATA_Z)
	MOV	R0,#sizeof(DATA_Z)
	CJNE	R0,#0,DATA_ZERO
	SJMP	DATA_ZERO_OUT
DATA_ZERO:
	MOV    	@R1,A
	INC	R1
	DJNZ	R0,DATA_ZERO
DATA_ZERO_OUT:


//------------------------------------------------------------------------
//
// Clear the IDATA_Z segment
//

	RSEG    IDATA_Z:IDATA:NOROOT
	RSEG    CSTART:CODE:NOROOT
	PUBLIC	__INIT_IDATA_Z

__INIT_IDATA_Z:
	CLR	A
	MOV	R1,#sfb(IDATA_Z)
	MOV	R0,#sizeof(IDATA_Z)
	CJNE	R0,#0,IDATA_ZERO
	SJMP	IDATA_ZERO_OUT
IDATA_ZERO:
	MOV    	@R1,A
	INC	R1
	DJNZ	R0,IDATA_ZERO
IDATA_ZERO_OUT:


//------------------------------------------------------------------------
//
// Clear the PDATA_Z segment
//

	RSEG    PDATA_Z:XDATA:NOROOT
	RSEG    CSTART:CODE:NOROOT
	PUBLIC	__INIT_PDATA_Z

__INIT_PDATA_Z:
	CLR	A
	MOV	R1,#LOW(sfb(PDATA_Z))
	MOV	R0,#sizeof(PDATA_Z)
	CJNE	R0,#0,PDATA_ZERO
	SJMP	PDATA_ZERO_OUT
PDATA_ZERO:
	MOVX   	@R1,A
	INC	R1
	DJNZ	R0,PDATA_ZERO
PDATA_ZERO_OUT:




//------------------------------------------------------------------------
//
// Clear the XDATA_Z segment
//

	RSEG    XDATA_Z:XDATA:NOROOT
	RSEG	CSTART:CODE:NOROOT
	PUBLIC	__INIT_XDATA_Z

__INIT_XDATA_Z:
	CLR	A
	MOV	DPTR,#sfb(XDATA_Z)
	MOV	R0,#(low(sizeof(XDATA_Z) + 1))
	MOV	R1,#(high(sizeof(XDATA_Z) + 0x0100))
	SJMP	XDATA_ZERO_TEST
XDATA_ZERO:
	MOVX    @DPTR,A
	INC	DPTR
XDATA_ZERO_TEST:
	DJNZ	R0,XDATA_ZERO
	DJNZ	R1,XDATA_ZERO


//------------------------------------------------------------------------
//
// Clear the IXDATA_Z segment
//

	RSEG    IXDATA_Z:XDATA:NOROOT
	RSEG	CSTART:CODE:NOROOT
	PUBLIC	__INIT_IXDATA_Z

__INIT_IXDATA_Z:
	CLR	A
	MOV	DPTR,#sfb(IXDATA_Z)
	MOV	R0,#(low(sizeof(IXDATA_Z) + 1))
	MOV	R1,#(high(sizeof(IXDATA_Z) + 0x0100))
	SJMP	IXDATA_ZERO_TEST
IXDATA_ZERO:
	MOVX    @DPTR,A
	INC	DPTR
IXDATA_ZERO_TEST:
	DJNZ	R0,IXDATA_ZERO
	DJNZ	R1,IXDATA_ZERO


//------------------------------------------------------------------------
//
// Clear the FAR_Z segment
//

#if (defined(__EXTENDED_DPTR__))

	RSEG    FAR_Z:XDATA:NOROOT
	RSEG	CSTART:CODE:NOROOT
	PUBLIC	__INIT_FAR_Z

__INIT_FAR_Z:
	CLR	A
  #if ( __CORE__ == __CORE_EXTENDED1__ )
	MOV	DPTR,#sfb(FAR_Z)
  #else
	MOV	DPL,#LOW(sfb(FAR_Z))
	MOV	DPH,#BYTE2(sfb(FAR_Z))
	MOV	?DPX,#BYTE3(sfb(FAR_Z))
  #endif
	MOV	R0,#(low(sizeof(FAR_Z) + 1))
	MOV	R1,#(high(sizeof(FAR_Z) + 0x0100))
	SJMP	FAR_ZERO_TEST
FAR_ZERO:
	MOVX    @DPTR,A
	INC	DPTR
FAR_ZERO_TEST:
	DJNZ	R0,FAR_ZERO
	DJNZ	R1,FAR_ZERO

#endif


//------------------------------------------------------------------------
//
// Clear the HUGE_Z segment
//

#if (defined(__EXTENDED_DPTR__))

	RSEG    HUGE_Z:XDATA:NOROOT
	RSEG	CSTART:CODE:NOROOT
	PUBLIC	__INIT_HUGE_Z

__INIT_HUGE_Z:
	CLR	A
  #if ( __CORE__ == __CORE_EXTENDED1__ )
	MOV	DPTR,#sfb(HUGE_Z)
  #else
	MOV	DPL,#LOW(sfb(HUGE_Z))
	MOV	DPH,#BYTE2(sfb(HUGE_Z))
	MOV	?DPX,#BYTE3(sfb(HUGE_Z))
  #endif
	MOV	R0,#(LOW(sizeof(HUGE_Z) + 1))
	MOV	R1,#(BYTE2(sizeof(HUGE_Z) + 0x000100))
	MOV	R2,#(BYTE3(sizeof(HUGE_Z) + 0x010000))
	SJMP	HUGE_ZERO_TEST
HUGE_ZERO:
	MOVX    @DPTR,A
	INC	DPTR
HUGE_ZERO_TEST:
	DJNZ	R0,HUGE_ZERO
	DJNZ	R1,HUGE_ZERO
	DJNZ	R2,HUGE_ZERO

#endif


//------------------------------------------------------------------------
//
//  Initializise the BDATA_I segment
//

	RSEG	BDATA_I:DATA:NOROOT	
	RSEG	BDATA_ID:CONST:NOROOT
	RSEG	CSTART:CODE:NOROOT
	PUBLIC	__INIT_BDATA_I

__INIT_BDATA_I:
	MOV	R0,#sfb(BDATA_I)
	MOV	DPTR,#sfb(BDATA_ID)
	MOV	R2,#sizeof(BDATA_I)
	CJNE	R2,#0,BDATA_INIT
	SJMP	BDATA_INIT_OUT
BDATA_INIT:
	CLR	A
	MOVC	A,@A+DPTR
	INC	DPTR
	MOV	@R0,A
	INC	R0
	DJNZ	R2,BDATA_INIT
BDATA_INIT_OUT:


//------------------------------------------------------------------------
//
//  Initializise the DATA_I segment
//

	RSEG	DATA_I:DATA:NOROOT	
	RSEG	DATA_ID:CONST:NOROOT
	RSEG	CSTART:CODE:NOROOT
	PUBLIC	__INIT_DATA_I

__INIT_DATA_I:
	MOV	R0,#sfb(DATA_I)
	MOV	DPTR,#sfb(DATA_ID)
	MOV	R2,#sizeof(DATA_I)
	CJNE	R2,#0,DATA_INIT
	SJMP	DATA_INIT_OUT
DATA_INIT:
	CLR	A
	MOVC	A,@A+DPTR
	INC	DPTR
	MOV	@R0,A
	INC	R0
	DJNZ	R2,DATA_INIT
DATA_INIT_OUT:


//------------------------------------------------------------------------
//
//  Initializise the IDATA_I segment
//

	RSEG    IDATA_I:IDATA:NOROOT
	RSEG    IDATA_ID:CODE:NOROOT	
	RSEG    CSTART:CODE:NOROOT
	PUBLIC	__INIT_IDATA_I

__INIT_IDATA_I:
	MOV	R0,#sfb(IDATA_I)
	MOV	DPTR,#sfb(IDATA_ID)
	MOV	R2,#sizeof(IDATA_I)
	CJNE	R2,#0,IDATA_INIT
	SJMP	IDATA_INIT_OUT
IDATA_INIT:
	CLR	A
	MOVC	A,@A+DPTR
	INC	DPTR
	MOV	@R0,A
	INC	R0
	DJNZ	R2,IDATA_INIT
IDATA_INIT_OUT:


//------------------------------------------------------------------------
//
//  Initializise the PDATA_I segment
//

	RSEG    PDATA_I:XDATA:NOROOT
	RSEG    PDATA_ID:CODE:NOROOT
	RSEG    CSTART:CODE:NOROOT
	PUBLIC	__INIT_PDATA_I

__INIT_PDATA_I:
	MOV	R0,#LOW(sfb(PDATA_I))
	MOV	DPTR,#sfb(PDATA_ID)
	MOV	R2,#sizeof(PDATA_I)
	CJNE	R2,#0,PDATA_INIT
	SJMP	PDATA_INIT_OUT
PDATA_INIT:
	CLR	A
	MOVC	A,@A+DPTR
	INC	DPTR
	MOVX	@R0,A
	INC	R0
	DJNZ	R2,PDATA_INIT
PDATA_INIT_OUT:


//------------------------------------------------------------------------
//
//  Initializise the XDATA_I segment
//

	RSEG    XDATA_I:XDATA:NOROOT
	RSEG    XDATA_ID:CODE:NOROOT	
	RSEG    CSTART:CODE:NOROOT
	PUBLIC	__INIT_XDATA_I

__INIT_XDATA_I:
	MOV	DPTR,#sfb(XDATA_I)
#if (defined(__EXTENDED_DPTR__) && ( __CORE__ != __CORE_EXTENDED1__ ))
    MOV ?DPX,#0
#endif
	MOV	R2,DPL
	MOV	R3,DPH
	MOV	DPTR,#sfb(XDATA_ID)
	MOV	R0,#(low(sizeof(XDATA_I) + 1))
	MOV	R1,#(high(sizeof(XDATA_I) + 0x0100))
	SJMP	XDATA_INIT_TEST
XDATA_INIT:
	CLR	A
	MOVC	A,@A+DPTR
	INC	DPTR
	MOV	R4,DPL
	MOV	R5,DPH
	MOV	DPL,R2

⌨️ 快捷键说明

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