📄 cstart.asm
字号:
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 + -