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