📄 start.asm
字号:
#if REGBANK > 31 || REGBANK < 0
# error REGBANK setting out of range
#endif
;====================================================================
; 4.6 Low-Level Library Interface
;====================================================================
#set CLIBINIT OFF ; <<< select extended libray usage
; This option has only to be set, if stream-IO/standard-IO function of
; the C-libraray have to be used (printf(), fopen()...). This also
; requires low-level functions to be defined by the application
; software.
; For other library functions like (e.g. sprintf()) all this is not
; necessary. However, several functions consume a large amount of stack.
;====================================================================
; 4.7 Clock Selection
;====================================================================
#set NOCLOCK 0 ; do not touch CKSCR register
#set MAINCLOCK 1 ; select main clock (1/2 external)
#set PLLx1 2 ; set PLL to x1 ext. clock/quartz
#set PLLx2 3 ; set PLL to x2 ext. clock/quartz
#set PLLx3 4 ; set PLL to x3 ext. clock/quartz
#set PLLx4 5 ; set PLL to x4 ext. clock/quartz
# if DEBUG == 1
#set CLOCKSPEED NOCLOCK ; <<< set PLL ratio
# else
#set CLOCKSPEED PLLx4 ; <<< set PLL ratio
# endif
#set CLOCKWAIT ON ; <<< wait for stabilized PLL, if
; PLL is used
; The clock is set quiet early. However, if CLOCKWAIT is ON, polling
; for machine clock to be switched to PLL is done at the end of this
; file. Therefore, the stabilization time is not wasted. Main() will
; finally start at correct speed. Resources can immediately be used.
;
; This startup file version does not support subclock.
;====================================================================
; 4.8 External Bus Interface
;====================================================================
#set SINGLE_CHIP 0 ; all internal
#set INTROM_EXTBUS 1 ; mask ROM, FLASH, or OTP ROM used
#set BUSMODE SINGLE_CHIP ; <<< set bus mode (see mode pins)
#set ROMMIRROR ON ; <<< ROM mirror function ON/OFF
; MB90500/400 family only
; In Internal ROM / External Bus mode one can select whether to mirror
; area FF4000..FFFFFF to 004000..00FFFF. This is necessary to get the
; compiler ROMCONST option working. However, if ROMCONST is not used,
; this area might be used to access external memory. This is intended
; to increase performance, if a lot of dynamic data have to be accessed.
; In SMALL and MEDIUM model these data can be accessed within bank 0,
; which allows to use near addressing.
; These controller without the ROMM-control register always have the
; mirror function on in INROM mode.
; If BUSMODE is "SINGLE_CHIP", ignore remaining bus settings.
#set AUTOWAIT_IO 0 ; <<< 0..3 waitstates for IO area
#set AUTOWAIT_LO 0 ; <<< 0..3 for lower external area
#set AUTOWAIT_HI 0 ; <<< 0..3 for higher external area
#set ADDR_PINS B'00000000 ; <<< select used address lines
; A23..A16 to be output.
; This is the value to be set in HACR-register. "1" means: pin used as
; IO-port. (B'10000000 => A23 not used, B'00000001 => A16 not used)
#set BUS_SIGNAL B'00000100 ; <<< enable bus control signals
; |||||||+-- ignored
; ||||||+--- bus width lower memory (0:16, 1:8Bit)
; |||||+---- output WR signal(s) (1: enabled )
; ||||+----- bus width upper memory (0:16, 1:8Bit)
; |||+------ bus width ext IO area (0:16, 1:8Bit)
; ||+------- enable HRQ input (1: enabled )
; |+-------- enable RDY input (1: enabled )
; +--------- output CLK signal (1:enabled )
; These settings correspond to the EPCR-register.
; Hint: Except for MB90500/400 devices the clock output is needed for
; external RDY synchronisation, if Ready function is used.
; Hint: Don't forget to enable WR signals, if external RAM has to be
; written to.
#set iARSR ((AUTOWAIT_IO<<6)|((AUTOWAIT_HI&3)<<4)|(AUTOWAIT_LO&3))
;====================================================================
; 4.10 Enable RAMCODE Copying
;====================================================================
#set COPY_RAMCODE OFF ; <<< enable RAMCODE section to
; be copied from ROM to RAM
; to get this option properly working the code to be executed has to
; be linked to section RAMCODE (e.g. by #pragma section). The section
; RAMCODE has be located in RAM and the section @RAMCODE has to be
; located at a fixed address in ROM by linker settings.
; <<< END OF SETTINGS >>>
;====================================================================
; 5 Section and Data Declaration
;====================================================================
;====================================================================
; 5.1 Several fixed addresses (fixed for MB90xxx controllers)
;====================================================================
LPMCR .EQU 0xA0 ; Low power mode control register
CKSCR .EQU 0xA1 ; Clock select control register
#if BUSMODE != SINGLE_CHIP
ARSR .EQU 0xA5 ; *1) Automatic ready function reg
HACR .EQU 0xA6 ; *1) External address output reg
EPCR .EQU 0xA7 ; *1) Bus control signal selection
#endif
#if FAMILY == MB90500 || FAMILY == MB90400
ROMM .EQU 0x6F ; *2) ROM mirror control register
#endif
WDTC .EQU 0xA8 ; Watchdog control register
TBTC .EQU 0xA9 ; Timerbase timer control register
; *1 only for devices with external bus
; *2 only for MB905xx (FFMC-16LX) devices
;====================================================================
; 5.2 Declaration of __near addressed data sections
;====================================================================
; sections to be cleared
.SECTION DATA, DATA, ALIGN=2 ; zero clear area
.SECTION DIRDATA, DIR, ALIGN=2 ; zero clear direct
.SECTION LIBDATA, DATA, ALIGN=2 ; zero clear lib area
; sections to be initialised with start-up values
.SECTION INIT, DATA, ALIGN=2 ; initialised area
.SECTION DIRINIT, DIR, ALIGN=2 ; initialised dir
.SECTION LIBINIT, DATA, ALIGN=2 ; initialised lib area
#if CONSTDATA == RAMCONST
.SECTION CINIT, DATA, ALIGN=2 ; initialised const
#endif
; sections containing start-up values for initialised sections above
.SECTION DCONST, CONST, ALIGN=2 ; DINIT initialisers
.SECTION DIRCONST, DIRCONST,ALIGN=2 ; DIRINIT initialisers
.SECTION LIBDCONST, CONST, ALIGN=2 ; LIBDCONST init val
; following setion is either copied to CINIT (RAMCONST) or
; mapped by ROM-mirror function (ROMCONST)
.SECTION CONST, CONST, ALIGN=2 ; CINIT initialisers
;====================================================================
; 5.3 Declaration of RAMCODE section and labels
;====================================================================
#if COPY_RAMCODE == ON
.SECTION RAMCODE, CODE, ALIGN=1
.IMPORT _RAM_RAMCODE ; provided by linker
.IMPORT _ROM_RAMCODE ; provided by linker
#endif
;====================================================================
; 5.4 Declaration of sections containing other sections description
;====================================================================
; DCLEAR contains start address and size of all sections to be cleared
; DTRANS contains source and destination address and size of all
; sections to be initialised with start-up values
; The compiler automatically adds a descriptor for each __far addressed
; data section to DCLEAR or DTRANS. These __far section are separated
; for each C-module.
; In addition the start-up file adds the descriptors of the previously
; declared __near section here. This way the same code in the start-up
; file can be used for initialising all sections.
.SECTION DCLEAR, CONST, ALIGN=2 ; zero clear table
; Address Bank Size
.DATA.H DATA, BNKSEC DATA, SIZEOF(DATA )
.DATA.H DIRDATA, BNKSEC DIRDATA, SIZEOF(DIRDATA)
.DATA.H LIBDATA, BNKSEC LIBDATA, SIZEOF(LIBDATA)
.SECTION DTRANS, CONST, ALIGN=2 ; copy table
; Address Bank Address Bank Size
.DATA.H DCONST, BNKSEC DCONST, INIT, BNKSEC INIT, SIZEOF INIT
.DATA.H DIRCONST, BNKSEC DIRCONST, DIRINIT,BNKSEC DIRINIT,SIZEOF DIRINIT
.DATA.H LIBDCONST,BNKSEC LIBDCONST,LIBINIT,BNKSEC LIBINIT,SIZEOF LIBINIT
#if CONSTDATA == RAMCONST
.DATA.H CONST, BNKSEC CONST, CINIT, BNKSEC CINIT, SIZEOF CINIT
#endif
#if COPY_RAMCODE == ON
.DATA.L _ROM_RAMCODE, _RAM_RAMCODE
.DATA.H SIZEOF RAMCODE
#endif
;====================================================================
; 5.5 Stack area and stack top definition
;====================================================================
.EXPORT SSTACK_BASE, SSTACK_TOP
.SECTION SSTACK, STACK, ALIGN=2
SSTACK_BASE:
.RES.H SSSIZE
SSTACK_TOP:
.SECTION USTACK, STACK, ALIGN=2
.RES.H USSIZE
USTACK_TOP:
;====================================================================
; 5.6 Direct page register dummy label definition
;====================================================================
.SECTION DIRDATA ; zero clear direct
DIRDATA_S: ; label for DPR init
; This label is used to get the page of the __direct data.
; Depending on the linkage order order this startup file the label is
; placed anywhere within the __direct data page. However, the
; statement "PAGE (DIRDATA_S)" is processed. Therefore, the lower
; 8 Bit of the address of DIRDATA_S are not relevant and this feature
; becomes linkage order independent.
; Note, the linker settings have to make sure that the all __direct
; data are located within the same physical page (256 Byte block).
;====================================================================
; 6 Start-Up Code
;====================================================================
;====================================================================
; 6.1 Import external symbols
;====================================================================
.IMPORT _main ; user code entrance
#if CLIBINIT == ON
.IMPORT __stream_init
.IMPORT _exit
.EXPORT __exit
#endif
;====================================================================
; ___ _____ __ ___ _____
; / | / \ | \ |
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -