⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cstartup.s34

📁 瑞萨单片机LCD控制
💻 S34
📖 第 1 页 / 共 2 页
字号:
;-----------------------------------------------------------------------;
;                                                                       ;
;                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 + -