📄 boot.tpl
字号:
ENDIF ; SYSTEM_SMALL_MEMORY_MODEL
IF ( SYSTEM_LARGE_MEMORY_MODEL )
mov reg[CUR_PP], >__r0 ; force direct addr mode instructions
; to use the Virtual Register page.
; Dereference the constant (flash) pointer pXIData to access the start
; of the extended idata area, "xidata." Xidata follows the end of the
; text segment and may have been relocated by the Code Compressor.
;
mov A, >__pXIData ; Get the address of the flash
mov X, <__pXIData ; pointer to the xidata area.
push A
romx ; get the MSB of xidata's address
mov [__r0], A
pop A
inc X
adc A, 0
romx ; get the LSB of xidata's address
swap A, X
mov A, [__r0] ; pXIData (in [A,X]) points to the
; XIData structure list in flash
jmp .AccessStruct
; Unpack one element in the xidata "structure list" that specifies the
; values of C variables. Each structure contains 3 member elements.
; The first is a pointer to a contiguous block of RAM to be initial-
; ized. Blocks are always 255 bytes or less in length and never cross
; RAM page boundaries. The list terminates when the MSB of the pointer
; contains 0xFF. There are two formats for the struct depending on the
; value in the second member element, an unsigned byte:
; (1) If the value of the second element is non-zero, it represents
; the 'size' of the block of RAM to be initialized. In this case, the
; third member of the struct is an array of bytes of length 'size' and
; the bytes are copied to the block of RAM.
; (2) If the value of the second element is zero, the block of RAM is
; to be cleared to zero. In this case, the third member of the struct
; is an unsigned byte containing the number of bytes to clear.
.AccessNextStructLoop:
inc X ; pXIData++
adc A, 0
.AccessStruct: ; Entry point for first block
;
; Assert: pXIData in [A,X] points to the beginning of an XIData struct.
;
M8C_ClearWDT ; Clear the watchdog for long inits
push A
romx ; MSB of RAM addr (CPU.A <- *pXIData)
mov reg[MVW_PP], A ; for use with MVI write operations
inc A ; End of Struct List? (MSB==0xFF?)
jz .C_RTE_WrapUp ; Yes, C runtime environment complete
pop A ; restore pXIData to [A,X]
inc X ; pXIData++
adc A, 0
push A
romx ; LSB of RAM addr (CPU.A <- *pXIData)
mov [__r0], A ; RAM Addr now in [reg[MVW_PP],[__r0]]
pop A ; restore pXIData to [A,X]
inc X ; pXIData++ (point to size)
adc A, 0
push A
romx ; Get the size (CPU.A <- *pXIData)
jz .ClearRAMBlockToZero ; If Size==0, then go clear RAM
mov [__r1], A ; else downcount in __r1
pop A ; restore pXIData to [A,X]
.CopyNextByteLoop:
; For each byte in the structure's array member, copy from flash to RAM.
; Assert: pXIData in [A,X] points to previous byte of flash source;
; [reg[MVW_PP],[__r0]] points to next RAM destination;
; __r1 holds a non-zero count of the number of bytes remaining.
;
inc X ; pXIData++ (point to next data byte)
adc A, 0
push A
romx ; Get the data value (CPU.A <- *pXIData)
mvi [__r0], A ; Transfer the data to RAM
tst [__r0], 0xff ; Check for page crossing
jnz .CopyLoopTail ; No crossing, keep going
mov A, reg[ MVW_PP] ; If crossing, bump MVW page reg
inc A
mov reg[ MVW_PP], A
.CopyLoopTail:
pop A ; restore pXIData to [A,X]
dec [__r1] ; End of this array in flash?
jnz .CopyNextByteLoop ; No, more bytes to copy
jmp .AccessNextStructLoop ; Yes, initialize another RAM block
.ClearRAMBlockToZero:
pop A ; restore pXIData to [A,X]
inc X ; pXIData++ (point to next data byte)
adc A, 0
push A
romx ; Get the run length (CPU.A <- *pXIData)
mov [__r1], A ; Initialize downcounter
mov A, 0 ; Initialize source data
.ClearRAMBlockLoop:
; Assert: [reg[MVW_PP],[__r0]] points to next RAM destination and
; __r1 holds a non-zero count of the number of bytes remaining.
;
mvi [__r0], A ; Clear a byte
tst [__r0], 0xff ; Check for page crossing
jnz .ClearLoopTail ; No crossing, keep going
mov A, reg[ MVW_PP] ; If crossing, bump MVW page reg
inc A
mov reg[ MVW_PP], A
mov A, 0 ; Restore the zero used for clearing
.ClearLoopTail:
dec [__r1] ; Was this the last byte?
jnz .ClearRAMBlockLoop ; No, continue
pop A ; Yes, restore pXIData to [A,X] and
jmp .AccessNextStructLoop ; initialize another RAM block
.C_RTE_WrapUp:
pop A ; balance stack
ENDIF ; SYSTEM_LARGE_MEMORY_MODEL
C_RTE_Done:
ENDIF ; C_LANGUAGE_SUPPORT
;-------------------------------
; Voltage Stabilization for SMP
;-------------------------------
IF ( POWER_SETTING & POWER_SET_5V0) ; 5.0V Operation
IF ( SWITCH_MODE_PUMP ^ 1 ) ; SMP is operational
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; When using the SMP at 5V, we must wait for Vdd to slew from 3.1V to
; 5V before enabling the Precision Power-On Reset (PPOR).
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
or reg[INT_MSK0],INT_MSK0_SLEEP
M8C_SetBank1
and reg[OSC_CR0], ~OSC_CR0_SLEEP
or reg[OSC_CR0], OSC_CR0_SLEEP_512Hz
M8C_SetBank0
M8C_ClearWDTAndSleep ; Restart the sleep timer
mov reg[INT_VC], 0 ; Clear all pending interrupts
.WaitFor2ms:
tst reg[INT_CLR0], INT_MSK0_SLEEP ; Test the SleepTimer Interrupt Status
jz .WaitFor2ms ; Branch fails when 2 msec has passed
ENDIF ; SMP is operational
ENDIF ; 5.0V Operation
;-------------------------------
; Set Power-On Reset (POR) Level
;-------------------------------
M8C_SetBank1
IF (POWER_SETTING & POWER_SET_2V7) ; 2.7V Operation?
; Yes, lowest trip already set
ELSE ; No, must adjust POR...
IF (POWER_SETTING & POWER_SET_3V3) ; 3.3V Operation?
or reg[VLT_CR], VLT_CR_POR_MID ; Yes, change to midpoint trip
ELSE
IF (POWER_SETTING & POWER_SET_5V0) ; 5.0V Operation?
IF (POWER_SETTING & POWER_SET_SLOW_IMO) ; and Slow Mode?
or reg[VLT_CR], VLT_CR_POR_MID ; Yes, set to midpoint trip
ELSE ; No, fast mode
IF ( CPU_CLOCK_JUST ^ OSC_CR0_CPU_24MHz ) ; As fast as 24MHz?
or reg[VLT_CR], VLT_CR_POR_MID ; No, change to midpoint trip
ELSE ; 24HMz ;
or reg[VLT_CR], VLT_CR_POR_HIGH ; Yes, switch to highest setting
ENDIF ; 24MHz
ENDIF ; Slow Mode
ENDIF ; 5.0V Operation
ENDIF ; 3.3V Operation
ENDIF ; 2.7V Operation
M8C_SetBank0
;----------------------------
; Wrap up and invoke "main"
;----------------------------
; Disable the Sleep interrupt that was used for timing above. In fact,
; no interrupts should be enabled now, so may as well clear the register.
;
mov reg[INT_MSK0],0
; Everything has started OK. Now select requested CPU & sleep frequency.
;
M8C_SetBank1
mov reg[OSC_CR0],(SLEEP_TIMER_JUST | CPU_CLOCK_JUST)
M8C_SetBank0
; Global Interrupt are NOT enabled, this should be done in main().
; LVD is set but will not occur unless Global Interrupts are enabled.
; Global Interrupts should be enabled as soon as possible in main().
;
mov reg[INT_VC],0 ; Clear any pending interrupts which may
; have been set during the boot process.
IF ENABLE_LJMP_TO_MAIN
ljmp _main ; goto main (no return)
ELSE
lcall _main ; call main
.Exit:
jmp .Exit ; Wait here after return till power-off or reset
ENDIF
;---------------------------------
; Library Access to Global Parms
;---------------------------------
;
bGetPowerSetting:
_bGetPowerSetting:
; Returns value of POWER_SETTING in the A register.
; No inputs. No Side Effects.
;
IF (POWER_SETTING & POWER_SET_2V7)
mov A, POWER_SETTING | POWER_SET_SLOW_IMO
ELSE
mov A, POWER_SETTING ; Supply voltage and internal main osc
ENDIF
ret
;---------------------------------
; Order Critical RAM & ROM AREAs
;---------------------------------
; 'TOP' is all that has been defined so far...
; ROM AREAs for C CONST, static & global items
;
AREA lit (ROM, REL, CON) ; 'const' definitions
AREA idata (ROM, REL, CON) ; Constants for initializing RAM
__idata_start:
AREA func_lit (ROM, REL, CON) ; Function Pointers
__func_lit_start:
IF ( SYSTEM_LARGE_MEMORY_MODEL )
; We use the func_lit area to store a pointer to extended initialized
; data (xidata) area that follows the text area. Func_lit isn't
; relocated by the code compressor, but the text area may shrink and
; that moves xidata around.
;
__pXIData: word __text_end ; ptr to extended idata
ENDIF
AREA psoc_config (ROM, REL, CON) ; Configuration Load & Unload
AREA UserModules (ROM, REL, CON) ; User Module APIs
; CODE segment for general use
;
AREA text (ROM, REL, CON)
__text_start:
; RAM area usage
;
AREA data (RAM, REL, CON) ; initialized RAM
__data_start:
AREA virtual_registers (RAM, REL, CON) ; Temp vars of C compiler
AREA InterruptRAM (RAM, REL, CON) ; Interrupts, on Page 0
AREA bss (RAM, REL, CON) ; general use
__bss_start:
; end of file boot.asm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -