⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 su164fsh.a66

📁 LIN_InitNode_C161xx.h preconfiguration for C161xx LIN_InitNode_C164xx.h preconfiguration for C164
💻 A66
📖 第 1 页 / 共 2 页
字号:


;------------------------------------------------------------------------------

; Special Function Register Addresses
SYSCON   DEFR   0FF12H
BUSCON0  DEFR   0FF0CH
SP       DEFR	0FE12H
STKOV    DEFR   0FE14H
STKUN    DEFR	0FE16H
P3       DEFR	0FFC4H
DP3      DEFR	0FFC6H
BUSCON1  DEFR   0FF14H
BUSCON2  DEFR   0FF16H
BUSCON3  DEFR   0FF18H
BUSCON4  DEFR   0FF1AH
ADDRSEL1 DEFR   0FE18H
ADDRSEL2 DEFR   0FE1AH
ADDRSEL3 DEFR   0FE1CH
ADDRSEL4 DEFR   0FE1EH

SYSCON2  DEFR	0F1D0H

%*DEFINE (ADDR (Val, Start, Range)) (
%SET (adr, %SUBSTR(%Start,1,(%LEN(%Start)- 3))%SUBSTR(%Start,%LEN(%Start),1))
%IF (%EQS (%Range,4K))     THEN (%SET (adr, (%adr AND 0FFF0H) + 0)) FI
%IF (%EQS (%Range,8K))     THEN (%SET (adr, (%adr AND 0FFE0H) + 1)) FI
%IF (%EQS (%Range,16K))    THEN (%SET (adr, (%adr AND 0FFC0H) + 2)) FI
%IF (%EQS (%Range,32K))    THEN (%SET (adr, (%adr AND 0FF80H) + 3)) FI
%IF (%EQS (%Range,64K))    THEN (%SET (adr, (%adr AND 0FF00H) + 4)) FI
%IF (%EQS (%Range,128K))   THEN (%SET (adr, (%adr AND 0FE00H) + 5)) FI
%IF (%EQS (%Range,256K))   THEN (%SET (adr, (%adr AND 0FC00H) + 6)) FI
%IF (%EQS (%Range,512K))   THEN (%SET (adr, (%adr AND 0F800H) + 7)) FI
%IF (%EQS (%Range,1024K))  THEN (%SET (adr, (%adr AND 0F000H) + 8)) FI
%IF (%EQS (%Range,1M))     THEN (%SET (adr, (%adr AND 0F000H) + 8)) FI
%IF (%EQS (%Range,2048K))  THEN (%SET (adr, (%adr AND 0E000H) + 9)) FI
%IF (%EQS (%Range,2M))     THEN (%SET (adr, (%adr AND 0E000H) + 9)) FI
%IF (%EQS (%Range,4096K))  THEN (%SET (adr, (%adr AND 0C000H) +10)) FI
%IF (%EQS (%Range,4M))     THEN (%SET (adr, (%adr AND 0C000H) +10)) FI
%IF (%EQS (%Range,8192K))  THEN (%SET (adr, (%adr AND 08000H) +11)) FI
%IF (%EQS (%Range,8M))     THEN (%SET (adr, (%adr AND 08000H) +11)) FI
%Val	EQU 	%adr
)

?C_RESET  	PROC TASK C_STARTUP INTNO RESET = 0
?C_STARTUP:     LABEL	Model


$IF (WATCHDOG = 0)
		DISWDT			; Disable watchdog timer
$ENDIF

BCON0L		SET     (_MTTC0 << 5) OR (_RWDC0 << 4)
BCON0L		SET	BCON0L OR ((NOT _MCTC0) AND 0FH)
BCON0L		SET	BCON0L AND (NOT (_RDYEN0 << 3))
BCON0L		SET	BCON0L OR (_RDY_AS << 3)
BCON0H		SET	(_ALECTL0 << 1) OR (_RDYEN0 << 4)
$IF (BTYP_ENABLE == 1)
BCON0L		SET	BCON0L OR (_BTYP0 << 6)
BCON0H		SET	BCON0H OR (_BUSACT0 << 2)
$ENDIF

$IF (BTYP_ENABLE == 0)
		BFLDL	BUSCON0,#03FH,#BCON0L
		BFLDH	BUSCON0,#012H,#BCON0H
$ELSE
		BFLDL	BUSCON0,#0FFH,#BCON0L
		BFLDH	BUSCON0,#016H,#BCON0H
$ENDIF

SYS_H		SET	(_STKSZ << 5) OR (_ROMS1 << 4) OR (_SGTDIS << 3)
SYS_H		SET	SYS_H OR (_ROMEN << 2) OR (_BYTDIS << 1) OR _CLKEN
SYS_L		SET	(_WRCFG << 7) OR (_XRAMEN << 2)
; Setup SYSCON Register

 		BFLDH	SYSCON,#0FFH,#SYS_H
		BFLDL	SYSCON,#084H,#SYS_L

$IF (BUSCON1 = 1)
BCON1		SET     (_MTTC1 << 5) OR (_RWDC1 << 4)
BCON1		SET	BCON1 OR ((NOT _MCTC1) AND 0FH)
BCON1		SET	BCON1 AND (NOT (_RDYEN1 << 3))
BCON1 		SET	BCON1 OR (_RDY_AS << 3)  OR (_BTYP1 << 6)
BCON1 		SET	BCON1 OR (_ALECTL1 << 9) OR (_BUSACT1 << 10)
BCON1		SET	BCON1 OR (_RDYEN1 << 12) OR (_CSREN1 << 14)
BCON1           SET     BCON1 OR (_CSWEN1 << 15)

%ADDR (ADDR1,%ADDRESS1,%RANGE1)
		MOV	ADDRSEL1,#ADDR1 
		MOV	BUSCON1,#BCON1
$ENDIF

$IF (BUSCON2 = 1)
BCON2		SET     (_MTTC2 << 5) OR (_RWDC2 << 4)
BCON2		SET	BCON2 OR ((NOT _MCTC2) AND 0FH)
BCON2		SET	BCON2 AND (NOT (_RDYEN2 << 3))
BCON2 		SET	BCON2 OR (_RDY_AS << 3)  OR (_BTYP2 << 6)
BCON2 		SET	BCON2 OR (_ALECTL2 << 9) OR (_BUSACT2 << 10)
BCON2		SET	BCON2 OR (_RDYEN2 << 12) OR (_CSREN2 << 14)
BCON2           SET     BCON2 OR (_CSWEN2 << 15)

%ADDR (ADDR2,%ADDRESS2,%RANGE2)
		MOV	ADDRSEL2,#ADDR2 
		MOV	BUSCON2,#BCON2
$ENDIF

$IF (BUSCON3 = 1)
BCON3		SET     (_MTTC3 << 5) OR (_RWDC3 << 4)
BCON3		SET	BCON3 OR ((NOT _MCTC3) AND 0FH)
BCON3		SET	BCON3 AND (NOT (_RDYEN3 << 3))
BCON3 		SET	BCON3 OR (_RDY_AS << 3)  OR (_BTYP3 << 6)
BCON3 		SET	BCON3 OR (_ALECTL3 << 9) OR (_BUSACT3 << 10)
BCON3		SET	BCON3 OR (_RDYEN3 << 12) OR (_CSREN3 << 14)
BCON3           SET     BCON3 OR (_CSWEN3 << 15)

%ADDR (ADDR3,%ADDRESS3,%RANGE3)
		MOV	ADDRSEL3,#ADDR3 
		MOV	BUSCON3,#BCON3
$ENDIF

$IF (BUSCON4 = 1)
BCON4		SET     (_MTTC4 << 5) OR (_RWDC4 << 4)
BCON4		SET	BCON4 OR ((NOT _MCTC4) AND 0FH)
BCON4		SET	BCON4 AND (NOT (_RDYEN4 << 3))
BCON4 		SET	BCON4 OR (_RDY_AS << 3)  OR (_BTYP4 << 6)
BCON4 		SET	BCON4 OR (_ALECTL4 << 9) OR (_BUSACT4 << 10)
BCON4		SET	BCON4 OR (_RDYEN4 << 12) OR (_CSREN4 << 14)
BCON4           SET     BCON4 OR (_CSWEN4 << 15)

%ADDR (ADDR4,%ADDRESS4,%RANGE4)
		MOV	ADDRSEL4,#ADDR4 
		MOV	BUSCON4,#BCON4
$ENDIF



$IF (STK_SIZE = 7)
		MOV	SP,#DPP3:_TOS		;INITIALIZE STACK POINTER
		MOV	STKUN,#DPP3:_TOS	;INITIALIZE STACK UNFL REGISTER
		MOV	STKOV,#DPP3:(_BOS+6*2)	;INITIALIZE STACK OVFL REGISTER
$ELSE
		MOV	STKOV,#(_BOS+6*2)	;INITIALIZE STACK OVFL REGISTER
$ENDIF

$IF NOT TINY

		EXTRN	?C_PAGEDPP0 : DATA16
		EXTRN	?C_PAGEDPP1 : DATA16
		EXTRN	?C_PAGEDPP2 : DATA16

$IF (DPPUSE = 1)
		MOV	DPP0,#?C_PAGEDPP0       ; INIT DPP0 VALUE
$ENDIF
		MOV	DPP1,#?C_PAGEDPP1	; DEFAULT NEAR CONST PAGE
		MOV	DPP2,#?C_PAGEDPP2	; DEFAULT NEAR DATA  PAGE

$ENDIF
		MOV	R4,#0ED00H
		MOV	0F1E0h,R4
		EXTR	#2H
		MOV	SYSCON2,#0500H
		MOV	SYSCON2,#0400H

               	MOV	CP,#?C_MAINREGISTERS
		EINIT

$IF NOT TINY
        	MOV	R0,#DPP2:?C_USERSTKTOP
$ELSE
	       	MOV	R0,#?C_USERSTKTOP
$ENDIF


;------------------------------------------------------------------------------
;
; The following code is necessary to set RAM variables to 0 at start-up
; (RESET) of the C application program.
;

$IF (CLR_MEMORY = 1)

		EXTRN	?C_CLRMEMSECSTART : WORD
Clr_Memory:
$IF TINY
		MOV	R8,#?C_CLRMEMSECSTART
		JMPR	cc_Z,EndClear

RepeatClear:
$IF (WATCHDOG = 1)
		SRVWDT				; SERVICE WATCHDOG
$ENDIF
		MOV	R5,#0
		MOV	R2,[R8+]    ; Count
		JMPR	cc_Z,EndClear
		MOV     R3,R2
		MOV     R4,[R8+]
		JBC     R2.14,ClearNear

ClearBit:	MOV	R3,R4
		SHR	R3,#3
		BCLR	R3.0
		ADD	R3,#0FD00H		; START OF BIT SPACE
		MOV	R5,#1
		SHL	R5,R4
		CPL	R5
		AND	R5,[R3]
		MOV	[R3],R5
		ADD	R4,#1
		SUB	R2,#1
		JMPR	cc_NZ,ClearBit
		JMPR	cc_UC,RepeatClear

ClearNear:
$IF (WATCHDOG = 1)
		SRVWDT				; SERVICE WATCHDOG
$ENDIF
		MOVB	[R4],RL5
		ADD	R4,#1
		SUB	R2,#1
		JMPR	cc_NN,ClearNear
		JMPR	cc_UC,RepeatClear

$ELSE
		MOV	R9,#SEG (?C_CLRMEMSECSTART)
		MOV	R8,#SOF (?C_CLRMEMSECSTART)
		MOV	R1,R8		
	        OR	R1,R9
		JMPR	cc_Z,EndClear

RepeatClear:
$IF (WATCHDOG = 1)
		SRVWDT				; SERVICE WATCHDOG
$ENDIF
		MOV	R5,#0
                EXTS    R9,#1
		MOV	R2,[R8+]    ; Count
		JMPR	cc_Z,EndClear
		MOV     R3,R2
                EXTS	R9,#1
		MOV     R4,[R8+]
		JBC     R2.14,ClearNear
		JBC     R2.15,ClearFar

ClearBit:	MOV	R3,R4
		SHR	R3,#3
		BCLR	R3.0
		ADD	R3,#0FD00H		; START OF BIT SPACE
		MOV	R5,#1
		SHL	R5,R4
		CPL	R5
		AND	R5,[R3]
		MOV	[R3],R5
		ADD	R4,#1
		SUB	R2,#1
		JMPR	cc_NZ,ClearBit
		JMPR	cc_UC,RepeatClear

ClearFar:	EXTS	R9,#1
                MOV	R3,[R8+]
RepClearFar:
$IF (WATCHDOG = 1)
		SRVWDT				; SERVICE WATCHDOG
$ENDIF
		EXTP	R4,#1
		MOVB	[R3],RL5
		ADD	R3,#1
		ADDC	R4,#0
		OR	R3,#0C000H
		SUB	R2,#1
		JMPR	cc_NN,RepClearFar
		JMPR	cc_UC,RepeatClear

ClearNear:
$IF (WATCHDOG = 1)
		SRVWDT				; SERVICE WATCHDOG
$ENDIF
		MOVB	[R4],RL5
		ADD	R4,#1
		SUB	R2,#1
		JMPR	cc_NN,ClearNear
		JMPR	cc_UC,RepeatClear
$ENDIF

EndClear:

$ENDIF

;------------------------------------------------------------------------------
;
;  The following code is necessary, if the application program contains
;  initialized variables at file level.
;

$IF (INIT_VARS = 1)

		EXTRN	?C_INITSECSTART : WORD
Init_Vars:
$IF TINY
		MOV	R8,#?C_INITSECSTART
RepeatInit:	
$IF (WATCHDOG = 1)
		SRVWDT				; SERVICE WATCHDOG
$ENDIF
		MOV	R2,[R8+]
		JMPR	cc_Z,EndInit
		JBC	R2.15,InitBit
		MOV	R4,R2
		AND	R2,#3FFFH
		JMPR	cc_NZ,LenLoad
		MOV	R4,#0
		MOV	R2,[R8+]
LenLoad:	MOV	R3,[R8+]
CopyInitVal:	MOVB	[R3],[R8+]
$IF (WATCHDOG = 1)
		SRVWDT				; SERVICE WATCHDOG
$ENDIF
		ADD	R3,#1
		SUB	R2,#1
		JMPR	cc_NZ,CopyInitVal
		JNB	R8.0,RepeatInit
		ADD	R8,#1
		JMPR	cc_UC,RepeatInit

InitBit:	MOVBZ	R3,RL2
		SHL	R3,#1
		OR 	R3,#0FD00H		; START OF BIT SPACE
		MOV	R4,#1
		MOVB	RL5,RH2
		SHL	R4,R5			; CALCULATE BIT MASK
		JB	R2.7,SetBit
		CPL	R4			; CLEAR BIT
		AND	R4,[R3]
		JMPR	cc_UC,StoreBit
SetBit:		OR	R4,[R3]			; SET BIT
StoreBit:	MOV	[R3],R4
		JMPR	cc_UC,RepeatInit

EndInit:

$ELSE
		MOV	R9,#SEG (?C_INITSECSTART)
		MOV	R8,#SOF (?C_INITSECSTART)
RepeatInit:	
$IF (WATCHDOG = 1)
		SRVWDT				; SERVICE WATCHDOG
$ENDIF
		MOV	DPP3,#3
		EXTS	R9,#1
		MOV	R2,[R8]
		JMPR	cc_Z,EndInit
		ADD	R8,#2
		ADDC	R9,#0
		JBC	R2.15,InitBit
		MOV	R4,R2
		AND	R2,#3FFFH
		JMPR	cc_NZ,LenLoad
		MOV	R4,#0
		EXTS	R9,#1
		MOV	R2,[R8]
		ADD	R8,#2
		ADDC	R9,#0
LenLoad:	EXTS	R9,#1
		MOV	R3,[R8]
		ADD	R8,#2
		ADDC	R9,#0
		JB	R4.14,CopyInitVal
		MOV	DPP3,R3
		EXTS	R9,#1
		MOV	R3,[R8]
		ADD	R8,#2
		ADDC	R9,#0
CopyInitVal:	EXTS	R9,#1
		MOVB	RL5,[R8]
		ADD	R8,#1
		ADDC	R9,#0
		MOVB	[R3],RL5
		ADD	R3,#1
		JB	R4.14,NoDPP3Adj
		JB	R3.14,NoDPP3Adj
		ADD	DPP3,#1
		OR	R3,#0C000H		; SET DPP3 Bits 
NoDPP3Adj:	
$IF (WATCHDOG = 1)
		SRVWDT				; SERVICE WATCHDOG
$ENDIF
		SUB	R2,#1
		JMPR	cc_NZ,CopyInitVal
		JNB	R8.0,RepeatInit
		ADD	R8,#1
		JMPR	cc_UC,RepeatInit

InitBit:	MOVBZ	R3,RL2
		SHL	R3,#1
		OR 	R3,#0FD00H		; START OF BIT SPACE
		MOV	R4,#1
		MOVB	RL5,RH2
		SHL	R4,R5			; CALCULATE BIT MASK
		JB	R2.7,SetBit
		CPL	R4			; CLEAR BIT
		AND	R4,[R3]
		JMPR	cc_UC,StoreBit
SetBit:		OR	R4,[R3]			; SET BIT
StoreBit:	MOV	[R3],R4
		JMPR	cc_UC,RepeatInit

EndInit:

$ENDIF

$ENDIF

;------------------------------------------------------------------------------

$IF TINY
		JMP	main
$ELSE
		JMP	FAR main
$ENDIF

?C_RESET	ENDP
?C_STARTUP_CODE	ENDS

$IF (INIT_VARS = 1)
EXTERN	?C_ENDINIT:WORD
$ENDIF

		END

⌨️ 快捷键说明

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