📄 su164fsh.a66.bak
字号:
;------------------------------------------------------------------------------
; 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,#08D00H
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 + -