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

📄 _start167.a66

📁 keilc pic的版本 才搞到的 希望对大家有帮助
💻 A66
📖 第 1 页 / 共 2 页
字号:
NAME    ?C_STARTUP
PUBLIC  ?C_STARTUP

$IF MEDIUM OR LARGE OR HLARGE
Model   LIT     'FAR'
$ELSE
Model   LIT     'NEAR'
$ENDIF

EXTRN   main:Model

PUBLIC          ?C_USRSTKBOT

?C_USERSTACK    SECTION DATA PUBLIC 'NDATA'

NDATA           DGROUP  ?C_USERSTACK

?C_USRSTKBOT:
		DS      USTSZ           ; Size of User Stack
?C_USERSTKTOP:
?C_USERSTACK    ENDS

?C_MAINREGISTERS        REGDEF  R0 - R15

$IF (STK_SIZE = 7)

?C_SYSSTACK     SECTION DATA PUBLIC 'IDATA'

SDATA           DGROUP  ?C_SYSSTACK

_BOS:                                   ; bottom of system stack
		DS      SSTSZ           ; Size of User Stack
_TOS:                                   ; top of system stack
?C_SYSSTACK     ENDS

$ELSE
; Setup Stack Overflow
_TOS    EQU     0FC00H                          ; top of system stack
_BOS    EQU     _TOS - (1024 >> _STKSZ1)        ; bottom of system stack
$ENDIF

PUBLIC          ?C_SYSSTKBOT
?C_SYSSTKBOT    EQU     _BOS

		SSKDEF  _STKSZ          ; System stack size

?C_STARTUP_CODE SECTION CODE    'ICODE'


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

; Special Function Register Addresses
SYSCON   DEFR   0FF12H
BUSCON0  DEFR   0FF0CH
CSP      DEFR   0FE08H
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


%*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_AS0 << 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_AS1 << 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)

$IF (ADDRESS1 = 0)    ; copy interrupt vectors to RAM, if RAM starts at address 0
; set window to RAM at 8 MByte to copy interrupt vectors
%ADDR (ADDR_INTS,800000H,4K)
		MOV     R0,CSP
		AND     R0,#0FFF0H              ; mask to 1st MByte
		JMPR    CC_Z,Copy_Int_Vecs3     ; skip copy if execution is
						; already in 1st Mbyte (Debug!)
		MOV     ADDRSEL1,#ADDR_INTS
		MOV     BUSCON1,#BCON1
		BMOV    BUSCON1.6,BUSCON0.6     ; move mux/nomux
Copy_Int_Vecs:
		MOV     DPP0,#200H              ; dest. at 8 MByte  (RAM)
		MOV     DPP1,#040H              ; source at 1 MByte (ROM)
		MOV     R0,#0200H
		MOV     R1,#4200H
Copy_Int_Vecs2: MOV     [R0],[R1]
		SUB     R1,#2
		SUB     R0,#2
		JMPR    CC_NZ,Copy_Int_Vecs2
Copy_Int_Vecs3:
$ENDIF
		MOV     ADDRSEL1,#ADDR1         ; activate SRAM
		MOV     BUSCON1,#BCON1
		BMOV    BUSCON1.6,BUSCON0.6     ; move mux/nomux
$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_AS2 << 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
		BMOV    BUSCON2.6,BUSCON0.6     ; move mux/nomux
$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_AS3 << 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
		BMOV    BUSCON3.6,BUSCON0.6     ; move mux/nomux
$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_AS4 << 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
		BMOV    BUSCON4.6,BUSCON0.6     ; move mux/nomux
$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



		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



		MOV     CP,#?C_MAINREGISTERS
		EINIT


		MOV     R0,#DPP2:?C_USERSTKTOP


;------------------------------------------------------------------------------
;
; 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:
		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
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:
		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

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

		JMP     FAR main

?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 + -