📄 start.asm
字号:
; ___/ | | | | \ | Begin of actual code section
;====================================================================
.SECTION CODE_START, CODE, ALIGN=1
;====================================================================
; 6.2 "NOT RESET YET" WARNING
;====================================================================
notresetyet:
NOP ; read hint below!!!!!!!
; If the debugger stays at the NOP above, the controller has not been
; reset yet. In order to reset all hardware register it is highly re-
; commended to reset the controller.
; However, if no reset vector has been defined on purpose, this dummy
; start address can also be used.
; This mechanism is using the .END instruction at the end of this mo-
; dule. It is not necessary for controller operation but improves
; security during debugging (mainly emulator debugger).
;====================================================================
; 6.3 Program start (the reset vector should point here)
;====================================================================
_start:
AND CCR, #0 ; disable interrups
MOV ILM,#7 ; set interrupt level mask to ALL
MOV RP,#REGBANK ; set register bank pointer
;====================================================================
; 6.4 Set clock ratio (ignore subclock)
;====================================================================
#if CLOCKSPEED != NOCLOCK
SETB I:CKSCR:2 ; set main clock
# if CLOCKSPEED > MAINCLOCK
NOP ; ensure that PLL is stopped before
NOP ; writing to CKSCR
MOV A, I:CKSCR ; copy clock register
AND A, #0xFC ; set x1 for PLL
# if CLOCKSPEED == PLLx2
OR A, #0x01 ; set x2 for PLL
# elif CLOCKSPEED == PLLx3 || CLOCKSPEED == PLLx6
OR A, #0x02 ; set x3 for PLL
# elif CLOCKSPEED == PLLx4 || CLOCKSPEED == PLLx8
OR A, #0x03 ; set x4 for PLL
# endif
#if EXTENDED_PLL == ON
# if CLOCKSPEED == PLLx6 || CLOCKSPEED == PLLx8
MOV I:PSCCR, #0x01 ; double the factor
# else
MOV I:PSCCR, #0x00 ; no doubling
# endif ; CLOCKSPEED
#endif ; EXTENDED_PLL
MOV I:CKSCR, A ; write back
CLRB I:CKSCR:2 ; enable PLL, PLL is not switched
; to the MCU yet but after stabi-
; lizing it switchs on its own to
; higher speed (see below)
# endif ; CLOCKSPEED > MAINCLOCK
#endif ; CLOCKSPEED != NOCLOCK
;====================================================================
; 6.5 Set external bus configuaration
;====================================================================
#if BUSMODE != SINGLE_CHIP ; ext bus used
MOV I:HACR, #ADDR_PINS ; set used upper address lines
MOV I:EPCR, #BUS_SIGNAL ; set used bus signals
MOV I:ARSR, #iARSR ; set auto-wait cycles
#endif
#if FAMILY == MB90500 || FAMILY == MB90400 || FAMILY == MB90300 || FAMILY == MB90800
; only these have ROMM
# if BUSMODE == INTROM_EXTBUS ; EXTBUS and INTROM/EXTROM
# if ROMMIRROR == OFF && CONSTDATA == ROMCONST
# error Mirror function must be ON to mirror internal ROM
# endif
# endif
MOV I:ROMM, #ROMMIRROR
#endif
;====================================================================
; 6.6 Copy initial values to data areas.
;====================================================================
;
; Each C-module has its own __far INIT section. The names are generic.
; DCONST_module contains the initialisers for the far data of the one
; module. INIT_module reserves the RAM area, which has to be loaded
; with the data from DCONST_module. ("module" is the name of the *.c
; file)
; All separated DCONST_module/INIT_module areas are described in
; DTRANS section by start addresses and length of each far section.
; 0000 1. source address (ROM)
; 0004 1. destination address (RAM)
; 0008 length of sections 1
; 000A 2. source address (ROM)
; 000E 2. destination address (RAM)
; 0012 length of sections 2
; 0014 3. source address ...
; In addition the start-up file adds the descriptors of the __near
; sections to this table. The order of the descriptors in this table
; depends on the linkage order.
;====================================================================
MOV A, #BNKSEC DTRANS ; get bank of table
MOV DTB, A ; store bank in DTB
MOVW RW1, #DTRANS ; get start offset of table
OR CCR, #H'20 ; System stack flag set (SSB used)
BRA LABEL2 ; branch to loop condition
LABEL1:
MOVW A, @RW1+6 ; get bank of destination
MOV SSB, A ; save dest bank in SSB
MOVW A, @RW1+2 ; get source bank
MOV ADB, A ; save source bank in ADB
MOVW A, @RW1+4 ; move destination addr in AL
MOVW A, @RW1 ; AL ->AH, src addr -> AL
MOVW RW0, @RW1+8 ; number of bytes to copy -> RW0
MOVSI SPB, ADB ; copy data
MOVN A, #10 ; length of one table entry is 10
ADDW RW1, A ; set pointer to next table entry
LABEL2:
MOVW A, RW1 ; get address of next block
SUBW A, #DTRANS ; sub address of first block
CMPW A, #SIZEOF (DTRANS) ; all blocks processed ?
BNE LABEL1 ; if not, branch
;====================================================================
; 6.7 Clear uninitialised data areas to zero
;====================================================================
;
; Each C-module has its own __far DATA section. The names are generic.
; DATA_module contains the reserved area (RAM) to be cleared.
; ("module" is the name of the *.c file)
; All separated DATA_module areas are described in DCLEAR section by
; start addresses and length of all far section.
; 0000 1. section address (RAM)
; 0004 length of section 1
; 0006 2. section address (RAM)
; 000A length of section 2
; 000C 3. section address (RAM)
; 0010 length of section 3 ...
; In addition the start-up file adds the descriptors of the __near
; section. to this table. The order of the descriptors in this table
; depends on the linkage order.
;====================================================================
MOV A, #BNKSEC DCLEAR ; get bank of table
MOV DTB, A ; store bank in DTB
MOVW RW1, #DCLEAR ; get start offset of table
BRA LABEL4 ; branch to loop condition
LABEL3:
MOV A, @RW1+2 ; get section bank
MOV ADB, A ; save section bank in ADB
MOVW RW0, @RW1+4 ; number of bytes to copy -> RW0
MOVW A, @RW1 ; move section addr in AL
MOVN A, #0 ; AL ->AH, init value -> AL
FILSI ADB ; write 0 to section
MOVN A, #6 ; length of one table entry is 6
ADDW RW1, A ; set pointer to next table entry
LABEL4:
MOVW A, RW1 ; get address of next block
SUBW A, #DCLEAR ; sub address of first block
CMPW A, #SIZEOF (DCLEAR) ; all blocks processed ?
BNE LABEL3 ; if not, branch
;====================================================================
; 6.8 Prepare stacks and set the default stack type
;====================================================================
AND CCR,#H'DF ; clear system stack flag
MOVL A, #(USTACK + SIZEOF(USTACK)) & ~1
MOVW SP,A ; load offset of stack top to pointer
SWAPW ; swap higher word to AL
MOV USB, A ; set bank
#if STACK_FILL == ON ; preset the stack
MOV ADB, A
MOVW A, #USTACK ; load start stack address to AL
MOVW A, #STACK_PATTERN ; AL -> AH, pattern in AL
MOVW RW0, #SIZEOF(USTACK) / 2 ; get byte count
FILSWI ADB ; write pattern to stack
#endif
OR CCR,#H'20 ; set System stack flag
MOVL A, #(SSTACK + SIZEOF(SSTACK)) & ~1
MOVW SP,A ; load offset of stack top to pointer
SWAPW ; swap higher word to AL
MOV SSB, A ; set bank
#if STACK_FILL == ON ; preset the stack
MOV ADB, A
MOVW A, #STACK ; load start stack address to AL
MOVW A, #STACK_PATTERN ; AL -> AH, pattern in AL
MOVW RW0, #SIZEOF(SSTACK) / 2; get byte count
FILSWI ADB ; write pattern to stack
#endif
#if STACKUSE == USRSTACK
AND CCR,#H'DF ; clear system stack flag
#endif
; Following macros are needed because of the AUTOMODEL option. If the
; model is not known while assembling the module, one has to expect
; completion of streaminit() by RET or RETP. Therefore, it is reloaded.
# macro RELOAD_SP
#if STACKUSE == USRSTACK
MOVW A, #(USTACK + SIZEOF(USTACK)) & ~1
#else
MOVW A, #(SSTACK + SIZEOF(SSTACK)) & ~1
#endif
MOVW SP,A
# endm
;====================================================================
; 6.9 Set Data Bank Register (DTB) and Direct Page Register (DPR)
;====================================================================
MOV A,#BNKSEC DATA ; User data bank offset
MOV DTB,A
MOV A,#PAGE DIRDATA_S ; User direct page
MOV DPR,A
;====================================================================
; 6.10 Wait for PLL to stabilise
;====================================================================
#if CLOCKSPEED > MAINCLOCK && CLOCKWAIT == ON
no_PLL_yet:
BBS I:CKSCR:6,no_PLL_yet ; check MCM and wait for
; PLL to stabilize
#endif
;====================================================================
; 6.11 Initialise Low-Level Library Interface
;====================================================================
;
; Call lib init function and reload stack afterwards, if AUTOMODEL
;====================================================================
#if CLIBINIT == ON
# if MEMMODEL == SMALL || MEMMODEL == COMPACT
CALL __stream_init ; initialise library IO
# else ; MEDIUM, LARGE, AUTOMODEL
CALLP __stream_init ; initialise library IO
# if MEMMODEL == AUTOMODEL
RELOAD_SP ; repair stack since stream_init was
; possibly left by RET (not RETP)
# endif ; AUTOMODEL
# endif ; MEDIUM, LARGE, AUTOMODEL
#endif ; LIBINI
;====================================================================
; 6.12 Call C-language main function
;====================================================================
#if MEMMODEL == SMALL || MEMMODEL == COMPACT
CALL _main ; Start main function
#else ; MEDIUM, LARGE, AUTOMODEL
CALLP _main ; Start main function
; ignore remaining word on stack,
; if main was completed by RET
;====================================================================
; 6.13 Shut down library
;====================================================================
#endif
#if CLIBINIT == ON
# if MEMMODEL == SMALL || MEMMODEL == COMPACT
CALL _exit
# else ; MEDIUM, LARGE, AUTOMODEL
CALLP _exit ; ignore remaining word on stack,
; if main was completed by RET
# endif
__exit:
#endif
;====================================================================
; 6.14 Program end loop
;====================================================================
end: BRA end ; Loop
;====================================================================
; 6.15 Debug address specification
;====================================================================
.END notresetyet ; define debugger start address
;====================================================================
; ----------------------- End of Start-up file ---------------------
;====================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -