;*************************************************************************** ;
; C COMPILER for R8C/Tiny, M16C/60,30,20,10
; Copyright(C) 1999(2000-2004). Renesas Technology Corp.
; and Renesas Solutions Corp., All rights reserved.
;
;
; ncrt0.a30 : NC30 startup program
;
; This program is applicable when using the basic I/O library
;
; $Id: ncrt0.a30,v 1.27.4.4 2004/10/29 14:06:38 simomura Exp $
;
;***************************************************************************

;--------------------------------------------------------------------
; set size of monitor area for FoUSB
;--------------------------------------------------------------------
.if _KD_
.if _Firmware_space == 0
FoUSB_MON   .equ    600H    ; for default
.else
FoUSB_MON   .equ    _Firmware_space
.endif
.endif
;---------------------------------------------------------------------
; HEEP SIZE definition
;---------------------------------------------------------------------
.if __HEAP__ == 1
HEAPSIZE    .equ    0H
.else

.if __HEAPSIZE__ == 0
HEAPSIZE    .equ    300H
.else
HEAPSIZE    .equ    __HEAPSIZE__
.endif

.endif

;---------------------------------------------------------------------
; STACK SIZE definition
;---------------------------------------------------------------------
.if __USTACKSIZE__ == 0
.if __R8C__ != 1
STACKSIZE   .equ    300h
.else
STACKSIZE   .equ    80h
.endif
.else
STACKSIZE   .equ    __USTACKSIZE__
.endif

;---------------------------------------------------------------------
; INTERRUPT STACK SIZE definition
;---------------------------------------------------------------------
.if __ISTACKSIZE__ == 0
.if __R8C__ != 1
ISTACKSIZE  .equ    300h
.else
ISTACKSIZE  .equ    80h
.endif
.else
ISTACKSIZE  .equ    __ISTACKSIZE__
.endif

;---------------------------------------------------------------------
; INTERRUPT VECTOR ADDRESS  definition
;---------------------------------------------------------------------
.if __R8C__ != 1
.if _KD_ == 1
    ; for FoUSB's monitor area
    ; 64 is variable vector's number
    ; 4 is each vector's size
VECTOR_ADR  .equ    0ff900h - (64*4)
SVECTOR_ADR     .equ    (0ff900h + FoUSB_MON)
.else
VECTOR_ADR  .equ    0ffd00h
SVECTOR_ADR     .equ    0ffe00h
.endif // _KD_
.else
VECTOR_ADR  .equ    0fedch
.endif

;---------------------------------------------------------------------
; Section allocation
;---------------------------------------------------------------------
    .list OFF
    .include sect30.inc
    .list ON

;---------------------------------------------------------------------
; SBDATA area definition
;---------------------------------------------------------------------
    .glb    __SB__
__SB__  .equ    data_SE_top

;====================================================================
; Initialize Macro declaration
;---------------------------------------------------------------------
N_BZERO .macro  TOP_ ,SECT_
    mov.b   #00H, R0L
    mov.w   #(TOP_ & 0FFFFH), A1
    mov.w   #sizeof SECT_ , R3
    sstr.b
    .endm

N_BCOPY .macro  FROM_,TO_,SECT_
    mov.w   #(FROM_ & 0FFFFH),A0
    mov.b   #(FROM_ >>16),R1H
    mov.w   #TO_ ,A1
    mov.w   #sizeof SECT_ , R3
    smovf.b
    .endm

BZERO   .macro  TOP_,SECT_
    push.w  #sizeof SECT_ >> 16
    push.w  #sizeof SECT_  & 0ffffh
    pusha   TOP_ >>16
    pusha   TOP_ & 0ffffh
    .stk    8
    .glb    _bzero
    .call   _bzero,G
    jsr.a   _bzero
    .endm

BCOPY   .macro  FROM_ ,TO_ ,SECT_
    push.w  #sizeof SECT_  >> 16
    push.w  #sizeof SECT_  & 0ffffh
    pusha   TO_ >>16
    pusha   TO_  & 0ffffh
    pusha   FROM_ >>16
    pusha   FROM_  & 0ffffh
    .stk    12
    .glb    _bcopy
    .call   _bcopy,G
    jsr.a   _bcopy
    .endm

.if __R8C__ != 1
;
; for M16C/60,30,20,10 series
;
;       .glb    __BankSelect
;__BankSelect   .equ    0BH

;---------------------------------------------------------------
; special page definition
;---------------------------------------------------------------
;       macro define for special page
;
;Format:
;   SPECIAL number
;

SPECIAL .macro  NUM
    .org    0FFFFEH-(NUM*2)
    .glb    __SPECIAL_@NUM
    .word   __SPECIAL_@NUM  & 0FFFFH
.endm
;====================================================================
; Interrupt section start
;---------------------------------------------------------------------
    .insf   start,S,0
    .glb    start
    .section    interrupt
start:
;---------------------------------------------------------------------
; after reset,this program will start
;---------------------------------------------------------------------
    ldc #istack_top,    isp ;set istack pointer
    mov.b   #02h,0ah
    mov.b   #00h,04h        ;set processer mode
    mov.b   #00h,0ah
    ldc #0080h, flg
    ldc #stack_top, sp  ;set stack pointer
    ldc #data_SE_top,   sb  ;set sb register
    ldintb  #VECTOR_ADR

;====================================================================
; NEAR area initialize.
;--------------------------------------------------------------------
; bss zero clear
;--------------------------------------------------------------------
    N_BZERO bss_SE_top,bss_SE
    N_BZERO bss_SO_top,bss_SO
    N_BZERO bss_NE_top,bss_NE
    N_BZERO bss_NO_top,bss_NO

;---------------------------------------------------------------------
; initialize data section
;---------------------------------------------------------------------
    N_BCOPY data_SEI_top,data_SE_top,data_SE
    N_BCOPY data_SOI_top,data_SO_top,data_SO
    N_BCOPY data_NEI_top,data_NE_top,data_NE
    N_BCOPY data_NOI_top,data_NO_top,data_NO

;====================================================================
; FAR area initialize.
;---------------------------------------------------------------------
; bss zero clear
;---------------------------------------------------------------------
    BZERO   bss_FE_top,bss_FE
    BZERO   bss_FO_top,bss_FO

;---------------------------------------------------------------------
; Copy edata_E(O) section from edata_EI(OI) section
;---------------------------------------------------------------------
    BCOPY   data_FEI_top,data_FE_top,data_FE
    BCOPY   data_FOI_top,data_FO_top,data_FO

    ldc #stack_top,sp
    .stk    -40

;====================================================================
; heap area initialize
;---------------------------------------------------------------------
.if __HEAP__ != 1
    .glb    __mbase
    .glb    __mnext
    .glb    __msize
    mov.w   #(heap_top&0FFFFH), __mbase
    mov.w   #(heap_top>>16), __mbase+2
    mov.w   #(heap_top&0FFFFH), __mnext
    mov.w   #(heap_top>>16), __mnext+2
    mov.w   #(HEAPSIZE&0FFFFH), __msize
    mov.w   #(HEAPSIZE>>16), __msize+2
.endif

;====================================================================
; Initialize standard I/O
;---------------------------------------------------------------------
.if __STANDARD_IO__ == 1
    .glb    _init
    .call   _init,G
    jsr.a   _init
.endif

;====================================================================
; Call main() function
;---------------------------------------------------------------------
    ldc #0h,fb  ; for debuger

    .glb    _main
    jsr.a   _main

.else   ; __R8C__

;---------------------------------------------------------------------
; for R8C/Tiny
;---------------------------------------------------------------------

;====================================================================
; Interrupt section start
;---------------------------------------------------------------------
    .insf   start,S,0
    .glb    start
    .section    interrupt
start:
;---------------------------------------------------------------------
; after reset,this program will start
;---------------------------------------------------------------------
    ldc #istack_top,    isp ;set istack pointer


    mov.b   #02h,0ah
    mov.b   #00h,04h        ;set processer mode
    mov.b   #00h,0ah

;   mov.b   #01h,0ah
;   mov.b   #08h,06h    ;set clock CM0
;   mov.b   #38h,07h    ;set clock CM1
;   mov.b   #00h,0ah

;   ldc #0080h, flg
    ldc #stack_top, sp  ;set stack pointer
    ldc #data_SE_top,   sb  ;set sb register
    ldintb  #VECTOR_ADR

;====================================================================
; NEAR area initialize.
;--------------------------------------------------------------------
; bss zero clear
;--------------------------------------------------------------------
    N_BZERO bss_SE_top,bss_SE
    N_BZERO bss_SO_top,bss_SO
    N_BZERO bss_NE_top,bss_NE
    N_BZERO bss_NO_top,bss_NO

;---------------------------------------------------------------------
; initialize data section
;---------------------------------------------------------------------
    N_BCOPY data_SEI_top,data_SE_top,data_SE
    N_BCOPY data_SOI_top,data_SO_top,data_SO
    N_BCOPY data_NEI_top,data_NE_top,data_NE
    N_BCOPY data_NOI_top,data_NO_top,data_NO

;====================================================================
; FAR area initialize.
;---------------------------------------------------------------------
; bss zero clear
;---------------------------------------------------------------------
;   BZERO   bss_FE_top,bss_FE
;   BZERO   bss_FO_top,bss_FO

;---------------------------------------------------------------------
; Copy edata_E(O) section from edata_EI(OI) section
;---------------------------------------------------------------------
;   BCOPY   data_FEI_top,data_FE_top,data_FE
;   BCOPY   data_FOI_top,data_FO_top,data_FO

    ldc #stack_top,sp
;   .stk    -40

;====================================================================
; heap area initialize
;---------------------------------------------------------------------
.if __HEAP__ != 1
    .glb    __mbase
    .glb    __mnext
    .glb    __msize
    mov.w   #(heap_top&0FFFFH), __mbase
    mov.w   #(heap_top&0FFFFH), __mnext
    mov.w   #(HEAPSIZE&0FFFFH), __msize
.endif

;====================================================================
; Initialize standard I/O
;---------------------------------------------------------------------
.if __STANDARD_IO__ == 1
    .glb    _init
    .call   _init,G
    jsr.a   _init
.endif

;====================================================================
; Call main() function
;---------------------------------------------------------------------
    ldc #0h,fb  ; for debuger

    .glb    _main
    jsr.a   _main

.endif  ; __R8C__

;====================================================================
; exit() function
;---------------------------------------------------------------------
    .glb    _exit
    .glb    $exit
_exit:             ; End program
$exit:
    jmp _exit
    .einsf
;====================================================================
; dummy interrupt function
;---------------------------------------------------------------------
    .glb    dummy_int
dummy_int:
    reit

    .end
;***************************************************************************
;
; C COMPILER for R8C/Tiny, M16C/60,30,20,10
; Copyright(C) 1999(2000-2004). Renesas Technology Corp.
; and Renesas Solutions Corp., All rights reserved.
;
;***************************************************************************