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

📄 cstart.asm

📁 ucos在xc167下的移植源程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        st.w    [a2+]64,d2              ; store null pointer in (last!) CSA
        add16   d15,#-1                 ; one CSA handled
;
        mov16.d d2,a2                   ; 
        extr.u  d2,d2,#6,#16            ; get CSA index
        or16    d2,d1                   ; add segment number
        mtcr    #LCX,d2                 ; initialize LCX (second CSA in first area)
        isync
        j       load_loop_count
;
next_areas:                             ; D3 = last CSA from previous area
        extr.u  d7,d3,#28,#4            ; extract segment number
        sh      d7,d7,#16               ; D1 = shifted segment number
        extr.u  d2,d3,#6,#16            ; get CSA index
        or16    d2,d7                   ; add segment number
        mov16.d d3,a2                   ; D3 = first CSA from this area
        st.w    [a2+]64,d2              ; store in first CSA from this area
        add16   d15,#-1                 ; one CSA handled
;
load_loop_count:
        jz      d15,init_fcx            ; if just one CSA in this area, then ready
        add16   d15,#-1                 ; 'correct' loopcount
        mov.a   a5,d15                  ; A5 = loop counter
loop:                                   ; D3 = previous CSA
        extr.u  d2,d3,#6,#16            ; get CSA index
        or16    d2,d1                   ; add segment number
        mov16.d d3,a2
        st.w    [a2+]64,d2              ; store "next" pointer
;
.include 'sibug_loop_before.inc'
;
        loop16  a5,loop
;
init_fcx:
        extr.u  d2,d3,#6,#16            ; get CSA index
        or16    d2,d1                   ; add segment number
        mtcr    #FCX,d2                 ; initialize FCX
        isync
;
test_max_csa_areas:
        add16   d0,#1                   ; increment index
        jlt     d0,#MAX_NR_OF_CSA_AREAS,start_linked_list
.endif

;
;
; Clear the ENDINIT bit in the WDT_CON0 register in order
; to disable the write-protection for registers protected 
; via the EndInit feature (for example: WDT_CON1).
;
        CALL.I  a2,_endinit_clear

;
;
; Call a function (assembly label) before the write-protection
; is enabled again. In this routine one can initialize the 
; registers protected via the EndInit feature.
; Beware that protected registers are unlocked for the duration 
; of the Time-out Period only!
;
.if @DEF('_CALL_ENDINIT')
        .extern _CALL_ENDINIT
        CALL.I  a2,_CALL_ENDINIT
.endif 

;
; Disable the Watchdog if requested. 
;       
.if @DEF('_WATCHDOG_DISABLE')
        CONST.A a2,WDT_CON1             ; get address WDT_CON1
        ld16.w  d0,[a2]                 ; load WDT_CON1
        CONST.D d1,0x08                 ; WDTDR is bit 3 of WDT_CON1
        or      d0,d0,d1                ; set WDT_CON1_WDTR 
        st16.w  [a2],d0                 ; request to disable the watchdog
.endif

;
;       TC113_PMU3 (aka PMI_TC.003) workaround:
;       The TLB-A and TLB-B mappings are set to a page size
;       of 16KB to workaround the TC113_PMU3 functional problem.
;
;       MMU_CON reset value: 0x7e0
;
.if ( @DEF('__TC113_PMU3__') || @DEF('__PMI_TC003__') ) && ( @DEF('_REGTC11IB_DEF') || @DEF('_REGTC1100_DEF') || @DEF('_REGTC1115_DEF') || @DEF('_REGTC1130_DEF') || @DEF('_REGTC1920B_DEF') )
        mov     d15,#(0x7e0 & ~0x1e | 0x14)
        mtcr    #MMU_CON,d15
.endif

;
;       Load Base Address of Trap Vector Table
;
;       Disable this if not started from RESET vector. (E.g.
;       ROM monitors require to keep in control of vectors)
;
.if !@DEF('_NO_BTV_INIT')
        CONST.D d0,_lc_u_trap_tab
        mtcr    #BTV,d0
        isync
.endif

;
;       Load Base Address of Interrupt Vector Table
;
;       Disable this if not started from RESET vector. (E.g.
;       ROM monitors require to keep in control of vectors)
;
.if !@DEF('_NO_BIV_INIT')
        CONST.D d0,_lc_u_int_tab
        mtcr    #BIV,d0
        isync
.endif

;
;       Load interupt stack pointer
;
;       Disable this if not started from RESET vector. (E.g.
;       ROM monitors require to keep in control of vectors)
;
.if !@DEF('_NO_ISP_INIT')
        CONST.D d0,_lc_ue_istack  
        CONST.D d7,STACK_ALIGN                  ; align label ue_istack, note that
        and     d0,d7                           ; ub_istack is aligned by the locator
        mtcr    #ISP,d0                         ; initialize interrupt stack pointer
        isync
.endif
               

;
;       PMU configuration
;
.if @DEF('_PMU_CON_VALUE')
        CONST.D d2, _PMU_CON_VALUE
        CONST.A a5, PMU_CON0
        st.w    [a5], d2
.endif
.if @DEF('_PMU_EIFCON_VALUE')
        CONST.D d2, _PMU_EIFCON_VALUE
        CONST.A a5, PMU_EIFCON
        st.w    [a5], d2
.endif

;
;       Data cache control (Reset 0H)
;
;
;       TC113_CPU13 workaround:
;               The 16KB D-Cache is enabled to workaround
;               the TC113_CPU13 functional problem.     
;               NOTE:   Setting the D-Cache size must be done at the
;                       very beginning of the startup code.
;
.if @DEF('__TC113_CPU13__')     
        mov16   d15,#1
        CONST.A a15, DMU_CON
        st.w    [a15], d15
.elif @DEF('_REGTC1765_DEF')
        mov16   d15,#0xCA
        CONST.A a15, DMU_CON
        st.w    [a15], d15
.endif

;
;       Bus configuration EBU_CLC within endinit 
;
.if @DEF('_EBUCLC_VALUE') && !@DEF('_NO_BUS_CONF')
        CONST.D d2, _EBUCLC_VALUE
        CONST.A a15, EBU_CLC
        st.w    [a15], d2
.endif

;
; Set the ENDINIT bit in the WDT_CON0 register again
; to enable the write-protection and to prevent a time-out. 
;
        CALL.I  a2,_endinit_set

 
;
;       TC113_PMU1 (aka PMU_TC.004) workaround:
;       The split mode is disabled on the LMB bus to workaround
;       the TC113_PMU1 functional problem.
;
.if ( @DEF('__TC113_PMU1__') || @DEF('__PMU_TC004__') ) && !( @DEF('_REGTC1766_DEF') || @DEF('_REGTC1792_DEF') || @DEF('_REGTC1796_DEF') || @DEF('_REGTC1796B_DEF') )
        mov16   d7,#-2
        CONST.A a15, LFI_CON
        ld.w    d15,[a15]
        and16   d15,d7
        st.w    [a15], d15      
.endif

;
;       TC112_COR15 workaround:
;       The starvation protection is disabled to workaround
;       the TC112_COR15 functional problem.
;
.if @DEF('__TC112_COR15__')
        CONST.A a3,BCU_CON
        CONST.D d2,0xFFF7FFFF
        ld16.w  d0,[a3]
        and     d0,d2,d0
        st16.w  [a3],d0 
.endif
 
;
;       Inititialize global address registers a0/a1 to support
;       __a0/__a1 storage qualifiers of the C compiler.
;
.if !@DEF('_NO_A0A1_ADDRESSING')
        CONST.A a0,_SMALL_DATA_
        CONST.A a1,_LITERAL_DATA_
.endif

;
;       Inititialize global address registers a8/a9 to support
;       __a8/__a9 storage qualifiers of the C compiler. A8 and A9
;       are reserved for OS use, or for application use in cases 
;       where the application ans OS are tightly coupled.
;
.if !@DEF('_NO_A8A9_ADDRESSING')
        CONST.A a8,_A8_DATA_
        CONST.A a9,_A9_DATA_
.endif
               
;
;       Initialize Bus configuration registers
;       
.if !@DEF('_NO_BUS_CONF')
;
;       Set register-values according to .define's created by the EDE
;
        .if @DEF('_ADDRSEL0_VALUE')
                CONST.D d2, _ADDRSEL0_VALUE
                CONST.A a15, EBU_ADDRSEL0
                st.w    [a15], d2
        .endif
        .if @DEF('_ADDRSEL1_VALUE')
                CONST.D d2, _ADDRSEL1_VALUE
                CONST.A a15, EBU_ADDRSEL1
                st.w    [a15], d2
        .endif
        .if @DEF('_ADDRSEL2_VALUE')
                CONST.D d2, _ADDRSEL2_VALUE
                CONST.A a15, EBU_ADDRSEL2
                st.w    [a15], d2
        .endif
        .if @DEF('_ADDRSEL3_VALUE')
                CONST.D d2, _ADDRSEL3_VALUE
                CONST.A a15, EBU_ADDRSEL3
                st.w    [a15], d2
        .endif
        .if @DEF('_ADDRSEL4_VALUE')
                CONST.D d2, _ADDRSEL4_VALUE
                CONST.A a15, EBU_ADDRSEL4
                st.w    [a15], d2
        .endif
        .if @DEF('_ADDRSEL5_VALUE')
                CONST.D d2, _ADDRSEL5_VALUE
                CONST.A a15, EBU_ADDRSEL5
                st.w    [a15], d2
        .endif
        .if @DEF('_ADDRSEL6_VALUE')
                CONST.D d2, _ADDRSEL6_VALUE
                CONST.A a15, EBU_ADDRSEL6
                st.w    [a15], d2
        .endif
        .if @DEF('_BUSAP0_VALUE')
                CONST.D d2, _BUSAP0_VALUE
                CONST.A a15, EBU_BUSAP0
                st.w    [a15], d2
        .endif
        .if @DEF('_BUSAP1_VALUE')
                CONST.D d2, _BUSAP1_VALUE
                CONST.A a15, EBU_BUSAP1
                st.w    [a15], d2
        .endif
        .if @DEF('_BUSAP2_VALUE')
                CONST.D d2, _BUSAP2_VALUE
                CONST.A a15, EBU_BUSAP2
                st.w    [a15], d2
        .endif
        .if @DEF('_BUSAP3_VALUE')
                CONST.D d2, _BUSAP3_VALUE
                CONST.A a15, EBU_BUSAP3
                st.w    [a15], d2
        .endif
        .if @DEF('_BUSAP4_VALUE')
                CONST.D d2, _BUSAP4_VALUE
                CONST.A a15, EBU_BUSAP4
                st.w    [a15], d2
        .endif
        .if @DEF('_BUSAP5_VALUE')
                CONST.D d2, _BUSAP5_VALUE
                CONST.A a15, EBU_BUSAP5
                st.w    [a15], d2
        .endif
        .if @DEF('_BUSAP6_VALUE')
                CONST.D d2, _BUSAP6_VALUE
                CONST.A a15, EBU_BUSAP6
                st.w    [a15], d2
        .endif
        .if @DEF('_BUSCON0_VALUE')
                CONST.D d2, _BUSCON0_VALUE

⌨️ 快捷键说明

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