📄 cstartup.s34
字号:
;-----------------------------------------------------------------------;
; ;
; cstartup.s34 ;
; ;
; This file contains the M16C C startup routine ;
; and must usually be tailored to suit customer's hardware. ;
; ;
; ;
; Version: 1.00 [01/Mar/96 IHAT] ;
; ;
; Defines: ;
; ;
; IGNORE_SEG_INIT To remove segment initialization ;
; IGNORE_NEAR_DATA To remove segment initialization ;
; for NEAR data. ;
; IGNORE_FAR_DATA To remove segment initialization ;
; for NEAR data. ;
; IGNORE_HUGE_DATA To remove segment initialization ;
; for NEAR data. ;
; IGNORE_STRING To remove segment initialization ;
; for string literals (-y). ;
; ;
;-----------------------------------------------------------------------;
; Uncomment one or more of the following if you want to remove
; certain initialization code:
; #define IGNORE_SEG_INIT
; #define IGNORE_NEAR_DATA
; #define IGNORE_FAR_DATA
; #define IGNORE_HUGE_DATA
; #define IGNORE_STRING
.name CSTARTUP
.extern main ; where to begin execution
.extern ?C_EXIT ; where to go when program is done
.extern __low_level_init
;---------------------------------------------------------------;
; CSTACK - The C stack segment ;
; ;
; Please, see in the link file lnk*.xcl how to increment ;
; the stack size without having to reassemble cstartup.s34 ! ;
;---------------------------------------------------------------;
.rseg CSTACK
.blkb 0
;---------------------------------------------------------------;
; ISTACK - The interrupt stack segment ;
; ;
; Please, see in the link file lnk*.xcl how to increment ;
; the stack size without having to reassemble cstartup.s34 ! ;
;---------------------------------------------------------------;
.rseg ISTACK
.blkb 0
;---------------------------------------------------------------;
; Forward declarations of segment used during initialization ;
;---------------------------------------------------------------;
.rseg UDATA0
.rseg IDATA0
.rseg CDATA0
.rseg UDATA1
.rseg IDATA1
.rseg CDATA1
.rseg UDATA2
.rseg IDATA2
.rseg CDATA2
.rseg ECSTR
.rseg CCSTR
.rseg CONST
.rseg CSTR
.common INTVEC
.common INTVEC1
;---------------------------------------------------------------;
; CODE - where the execution actually begins ;
;---------------------------------------------------------------;
.rseg CODE
init_C
ldc #sfe(ISTACK),isp ; set up interrupt stack
fset u ; select user stack
ldc #sfe(CSTACK),sp ; set up C stack
ldintb #sfb(INTVEC) ; Set up INTB register
;---------------------------------------------------------------;
; Call __low_level_init to perform initialization before ;
; initializing segments and calling main. ;
; If the function returns 0 no segment initialization should ;
; take place. ;
; ;
; Link with your own version of __low_level_init to override ;
; the default action: to do nothing but return 1. ;
;---------------------------------------------------------------;
jsr.a __low_level_init
#ifndef IGNORE_SEG_INIT
#if !defined(IGNORE_FAR_DATA) || !defined(IGNORE_HUGE_DATA)
.extern ?GENERIC_MOVE_LONG_L08
#endif
;---------------------------------------------------------------;
; Run-time test whether we should do segment initialization ;
;---------------------------------------------------------------;
tst.b r0l,r0l
jne skip_over
jmp skip_segment_initialization
skip_over
;---------------------------------------------------------------;
; Perform segment initialization of all memory. ;
;---------------------------------------------------------------;
#ifndef IGNORE_NEAR_DATA
;---------------------------------------------------------------;
; Perform segment initialization of NEAR data memory. ;
;---------------------------------------------------------------;
; 1. Clear uninitialized near variables
mov.w #sizeof(UDATA0),r3
jeq skip_udata0
mov.w #sfb(UDATA0),a1
mov.b #0,r0l
sstr.b
skip_udata0
; 2. Give initialized near variables its default values
mov.w #sizeof(CDATA0),r3
jeq skip_idata0
mov.w #sfb(IDATA0),a1
mov.w #low(sfb(CDATA0)),a0
mov.b #byte3(sfb(CDATA0)),r1h
smovf.b
skip_idata0
#endif /* IGNORE_NEAR_DATA */
#ifndef IGNORE_FAR_DATA
;---------------------------------------------------------------;
; Perform segment initialization of FAR data memory. ;
;---------------------------------------------------------------;
; 3. Clear uninitialized far variables
mov.w #lwrd(sizeof(UDATA1)),r0
mov.w #hwrd(sizeof(UDATA1)),r2
mov.w #lwrd(sfb(UDATA1)),a0
mov.w #hwrd(sfb(UDATA1)),a1
mov.b #0,r1l
udata1_loop
mov.w r2,r3 ; are we done ?
or.w r0,r3
jeq done_udata1
ste.b r1l,[a1a0]
inc.w a0
jne udata1_skip
inc.w a1
udata1_skip
add.w #-1,r0
sbb.w #0,r2
jmp udata1_loop
done_udata1
; 4. Give initialized far variables its default values
mov.w #lwrd(sfb(IDATA1)),a0
mov.w #hwrd(sfb(IDATA1)),a1
mov.w #lwrd(sfb(CDATA1)),r0
mov.w #hwrd(sfb(CDATA1)),r2
mov.w #lwrd(sizeof(CDATA1)),r1
mov.w #hwrd(sizeof(CDATA1)),r3
jsr.a ?GENERIC_MOVE_LONG_L08
#endif /* IGNORE_FAR_DATA */
#ifndef IGNORE_HUGE_DATA
;---------------------------------------------------------------;
; Perform segment initialization of HUGE data memory. ;
;---------------------------------------------------------------;
; 5. Clear uninitialized far variables
mov.w #lwrd(sizeof(UDATA2)),r0
mov.w #hwrd(sizeof(UDATA2)),r2
mov.w #lwrd(sfb(UDATA2)),a0
mov.w #hwrd(sfb(UDATA2)),a1
mov.b #0,r1l
udata2_loop
mov.w r2,r3 ; are we done ?
or.w r0,r3
jeq done_udata2
ste.b r1l,[a1a0]
inc.w a0
jne udata2_skip
inc.w a1
udata2_skip
add.w #-1,r0
sbb.w #0,r2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -