📄 start164.a66
字号:
%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 (_XRAMEN << 2)
$IF (WRCFG_ENABLE == 1)
SYS_L SET SYS_L OR (_WRCFG << 7)
$ENDIF
; Setup SYSCON Register
BFLDH SYSCON,#0FFH,#SYS_H
$IF (WRCFG_ENABLE == 1)
BFLDL SYSCON,#084H,#SYS_L
$ELSE
BFLDL SYSCON,#004H,#SYS_L
$ENDIF
;
$IF (ADVANCED_SYSCON = 1)
SYS_2 SET (PDCON << 4) OR (RTC << 6) OR (SCS << 7)
SYS_2 SET SYS_2 OR (CLKCON << 8) OR (CLKREL << 10)
SYS_3 SET ADCDIS OR (ASC0DIS << 1) OR (SSCDIS << 2)
SYS_3 SET SYS_3 OR (GPT1DIS << 3) OR (GPT2DIS << 4)
SYS_3 SET SYS_3 OR (FMDIS << 5) OR (CC1DIS << 6) OR (CC2DIS << 7)
SYS_3 SET SYS_3 OR (CC6DIS << 8) OR (PWMDIS << 9)
SYS_3 SET SYS_3 OR (ASC1DIS << 10) OR (I2CDIS << 11)
SYS_3 SET SYS_3 OR (CAN1DIS << 13) OR (CAN2DIS << 14)
SYS_3 SET SYS_3 OR (PCDDIS << 15)
EXTR #2
MOV SYSCON2,#SYS_2
MOV SYSCON3,#SYS_3
$ENDIF
;
$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)
MOV ADDRSEL1,#ADDR1
MOV BUSCON1,#BCON1
$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 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 + -